Skip to main content
 首页 » 编程设计

Python 迭代 RegEx 从定界符之间提取文本

2025年05月04日35傻小

我有一个正则表达式函数,可以从两个预定义分隔符(开始和结束)之间提取字符串元素:

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 以遍历字符串并选择所有匹配项?

请您参考如下方法:

使用正则表达式进行后视和前视:

>>> 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']