首页 > 解决方案 > python 正则表达式lookbehindlookahead

问题描述

几天前我发布了一个关于如何在某个正则表达式匹配之前捕获文本中的单词的问题。 在此处输入链接描述

使用提出的解决方案,我在 regex101 中尝试获取符合匹配项的单词。

这是代码:

content="""Lorem ipsum dolor sit amet (12,16) , consectetur 23 adipiscing elit. Curabitur (45) euismod scelerisque consectetur. Vivamus aliquam velit (46,48,49) at augue faucibus, id eleifend purus (34) egestas. Aliquam vitae mauris cursus, facilisis enim (23) condimentum, vestibulum enim. """

print(content)
pattern =re.compile(r"((?:\w+ ?){1,5}(?=\(\d))(\([\d]+\))(?: )(?:\w+ ?){1,5}")
matches = pattern.findall(content)
print('the matches are:')
print(matches)

正则表达式有效并捕获括号之间的数字。

这是正则表达式的解释

((?:\w+ ?){1,5}(?=\(\d))(\([\d]+\))(?: )(?:\w+ ?){1,5}
________________________***********++++++++++++++

____ = 这是后面的样子。在匹配之前查找 1 到 5 个单词以找到一个开放 (

****= 实际的正则表达式 ===> 括号之间的数字

++++= 这是我在正则表达式之后假装用来捕捉单词的部分。

我在 regex101 中尝试了这个显然不错的结果:

在此处输入图像描述

但是代码的结果如下:

[('Curabitur ', '(45)'), ('id eleifend purus ', '(34)'), ('facilisis enim ', '(23)')]

如您所见,该列表首先包含带有前面单词的元组,然后是匹配本身,但不包含以下单词。

钓点在哪里???

我的预期结果是:

matches=[('Curabitur ', '(45)', '**euismod scelerisque consectetur**'), ('id eleifend purus ', '(34)', '**egestas**'), ('facilisis enim ', '(23)', '**condimentum**')]

标签: pythonregexlookaheadlookbehind

解决方案


您的正则表达式还需要有第三个捕获组才能被返回findall

>>> print re.findall(r"((?:\w+ ?){1,5}(?=\(\d))(\(\d+\))(?: )((?:\w+ ?){1,5})", content)
[('Curabitur ', '(45)', 'euismod scelerisque consectetur'), ('id eleifend purus ', '(34)', 'egestas'), ('facilisis enim ', '(23)', 'condimentum')]

注意((?:\w+ ?){1,5})作为第三个捕获组。

另请注意,[\d]+它相当于\d+.


推荐阅读