我有一个正则表达式函数,它从两个预定义的分隔符(开始和结束)之间提取字符串元素:
def Findy(start, end, anystring):
result = (anystring.split(start)[1].split(end)[0])
return result
string = "I want A and I want B and I want C and..."
Findy('want', 'and', string)
>>>'A'
但这只能抓住它找到的第一场比赛;我需要的是得到所有的比赛,所以;
Findy('want', 'and', string)
>>>['A','B','C']
我尝试合并re.findall,但我并不总是知道我的开始和结束分隔符之间存在什么样的模式,所以那里没有运气。
如何重构Findy迭代字符串并获取所有匹配项?
答案 0 :(得分:3)
使用带有后视和前瞻的正则表达式:
>>> import re
>>> string = "I want A and I want B and I want C and..."
>>> re.findall(r'(?<=want ).*?(?= and)', string)
['A', 'B', 'C']
正则表达式分为三个部分:
(?<=want )
仅当前面带有字符串want
时才匹配。
.*?
这匹配任何字符。尾随?
使得此匹配非贪婪。这意味着它找到满足整体正则表达式的最短字符串。
(?= and)
仅当字符串中的此点后跟and
时才匹配。
单独并供将来参考,请注意string
是标准模块的名称,最佳做法是不选择可能与标准模块冲突的变量名称。
正如AvinashRaj指出的那样,我们也可以使用捕获组而不是后视,前瞻组合来做到这一点:
>>> re.findall(r'\bwant\s+(.*?)\s+and\b', string)
['A', 'B', 'C']
答案 1 :(得分:1)
不知道此代码是否满足您:
def findy(start, end, anystr):
res = []
tmp = anystr.split(start)[1:]
for e in tmp:
res.append(e.split(end)[0].strip())
return res
答案 2 :(得分:1)
这是一个重新定义Findy的脚本:
margin
输出:from __future__ import print_function
import re
def Findy(start, end, anystring):
pattern = '{}(.*?){}'.format(start, end)
return re.findall(pattern, anystring)
string = 'I want A and I want B and I want C and...'
print(Findy('want', 'and', string))
模式如下:
UDPATE :如果您不想使用空白字符,可以使用>>> [' A ', ' B ', ' C ']
pattern = '{}\s*(\S*?)\s*{}'.format(start, end)
输出:\s matches any white space character
\S matches any non-white space character