我需要提取一个包含提取字段中单词的字符串:
[[cat]][[dog]][[mouse]][[apple]][[banana]][[pear]][[plum]][[pool]]
因此,我需要:cat dog mouse apple banana pear plum pool
。
我已经尝试了2个小时来为此做一个正则表达式。
我得到的最好的是(?<=[[]\S)(.*)(?=]])
这让我:
cat]][[dog]][[mouse]][[apple]][[banana]][[pear]][[plum]][[pool
有什么想法吗?谢谢!
答案 0 :(得分:1)
这是re.finditer
的解决方案。让你的字符串为s
。
这假设[[和]]之间可以存在任何内容。否则,@ noob的评论适用。
>>> [x.group(1) for x in re.finditer('\[\[(.*?)\]\]', s)]
['cat', 'dog', 'mouse', 'apple', 'banana', 'pear', 'plum', 'pool']
或者,使用外观和re.findall
:
>>> re.findall('(?<=\[\[).*?(?=\]\])', s)
['cat', 'dog', 'mouse', 'apple', 'banana', 'pear', 'plum', 'pool']
对于大型字符串,当我计算替代方案时,finditer
版本似乎稍快一些。
In [5]: s=s*1000
In [6]: timeit [x.group(1) for x in re.finditer('\[\[(.*?)\]\]', s)]
100 loops, best of 3: 3.61 ms per loop
In [7]: timeit re.findall('(?<=\[\[).*?(?=\]\])', s)
100 loops, best of 3: 5.93 ms per loop
答案 1 :(得分:1)
简单re.split
将起作用:
>>> s = '[[cat]][[dog]][[mouse]][[apple]][[banana]][[pear]][[plum]][[pool]]'
>>> import re
>>> print re.split(r'[\[\]]{2,4}', s)[1:-1]
['cat', 'dog', 'mouse', 'apple', 'banana', 'pear', 'plum', 'pool']
答案 2 :(得分:0)
你必须用正则表达式吗?
extract = "[[cat]][[dog]][[mouse]][[apple]][[banana]][[pear]][[plum]][[pool]]"
word_list = [word for word in extract.replace('[', '').split(']') if word != '']
print word_list
输出:
['cat', 'dog', 'mouse', 'apple', 'banana', 'pear', 'plum', 'pool']
现在用正则表达式获取。只需找到没有括号的非空字符串。
导入重新
target = "[[cat]][[dog]][[mouse]][[apple]][[banana]][[pear]][[plum]][[pool]]"
word_list = ' '.join(re.findall("[^\[\]]+", target))
print word_list
编辑返回单个字符串,而不是字符串列表。