为什么正则表达式先行断言找不到短语,但Python中的非捕获组却可以找到? [重复]

问题描述 投票:0回答:1

在 python 中的字符串中,我想找到第一个 8 位数字,后跟下划线和一些单词,然后最多 5 个单词,然后是“上一个”或“上一个”单词。
我已经创建了这个正则表达式,但它没有找到它:
re.search(r'(?<=\b)(\d{8})(?=_\w+)(?:[^\w\n]+\w+){0,5}?[^\w\n]+(prev|previous)\b',
         'this 12345678_offer was one of previous'
         )

但是,如果我将前瞻断言更改为不匹配组,它会找到它:

re.search(r'(?<=\b)(\d{8})(?:_\w+)(?:[^\w\n]+\w+){0,5}?[^\w\n]+(prev|previous)\b',
         'this 12345678_offer was one of previous'
         ).groups()

我有两个问题:

  1. 为什么前瞻断言找不到它,但非捕获组却找到了?
  2. 如何判断,在哪种情况下使用哪一个?

谢谢。

python regex
1个回答
0
投票

先行断言不起作用,因为它不消耗字符,因此正则表达式引擎不会越过它检查的下划线和单词。然而,非捕获组确实会消耗字符,从而允许正则表达式继续匹配模式的其余部分。使用前瞻检查条件而不影响正则表达式位置,并在需要在序列中包含模式但不捕获它以供进一步使用时使用非捕获组。

© www.soinside.com 2019 - 2024. All rights reserved.