python正则表达式lookahead后面

时间:2019-01-08 20:16:14

标签: python regex lookahead lookbehind

几天前,我发布了一个问题,关于如何在某个正则表达式匹配之前捕获文本中的单词。 enter link description here

使用提出的解决方案,我在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中尝试了一下,结果看起来很不错:

enter image description here

但是代码的结果如下:

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

如您所见,列表中包含先有前几个单词的tuple,然后是匹配项本身,但不包含以下单词。

渔获物在哪里??

我的预期结果是:

  

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

1 个答案:

答案 0 :(得分:1)

您的正则表达式也需要有一个第三捕获组,以便由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+