python 正则表达式 lookbehind lookahead

python regex lookbehind lookahead

我几天前发布了一个关于如何捕捉文本中特定正则表达式匹配之前的单词的问题。

根据建议的解决方案,我尝试使用 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**')]

您的正则表达式还需要有第三个捕获组才能被 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+