我有一个regex函数,它从两个预定义分隔符(start&;结束):
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来迭代字符串并提取所有匹配项
使用带有“向后看”和“向前看”的正则表达式:
工作原理
正则表达式分为三部分:
(?<=want )
仅当前面有字符串
want
时才匹配.*?
这匹配任何字符。后面的
?
使这个匹配不贪婪。这意味着它会找到满足整个正则表达式的最短字符串(?= and)
仅当字符串中的该点后跟
and
时,才匹配另外,请注意
string
是标准模块的名称,最好不要选择可能与标准模块冲突的变量名备选方案
正如AvinashRaj所指出的,我们也可以使用一个捕获组来完成这个任务,而不是使用“向后看,向前看”的组合:
下面是一个脚本,重新定义芬迪:
输出:
>>> [' A ', ' B ', ' C ']
模式如下:
UDPATE:如果不需要空格字符,可以使用
pattern = '{}\s*(\S*?)\s*{}'.format(start, end)
输出:
>>> ['A', 'B', 'C']
不知道此代码是否满足您的要求:
相关问题 更多 >
编程相关推荐