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

标签 python regex string

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

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

关于Python 迭代 RegEx 从定界符之间提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33862613/

相关文章:

c++ - 正则表达式 ("(abc|aa.*|bb.*)") 与正则表达式 ("(aa.*|bb.*|cc.*)");

regex - R:如何查找字符串中的第一个数字

python 正则表达式匹配不起作用

javascript - 从字符串创建对象,javascript

python - 反转 Python 字符串中的单词(包括标点符号)

python - 绘制一个图,其中右侧有一个额外的 y 轴,顶部有一个额外的 x 轴,链接到底部的轴

python - 将字典键映射到 pandas df 中的新列

python - 如何使用python和Opencv读取视频文件

python - Pandas 有条件地替换或更新整行

java - 防止第一个字符为空格的字符串模式