Python 正则表达式正向前瞻

3 投票
2 回答
5672 浏览
提问于 2025-04-17 05:58

我有一个正则表达式,它的作用是找到以标点符号结尾的单词序列。这个“向前看”的功能确保在匹配的内容后面有一个空格和一个大写字母或数字。

pat1 = re.compile(r"\w.+?[?.!](?=\s[A-Z\d])"

下面这个“向前看”的功能是干什么的?

pat2 = re.compile(r"\w.+?[?.!](?=\s+[A-Z\d])"

Python 3.2 支持可变的“向前看”吗(\s+)?我没有遇到任何错误。而且我发现这两种模式似乎没有区别。不管我有多少个空格,它们的效果都一样。那这个 \s+ 在“向前看”中有什么用呢?

2 个回答

2

我不太明白你想要实现什么。

以标点符号结束的单词序列可以用类似下面的方式来匹配:

re.findall(r'([\w\s]*[\?\!\.;])', s)

前瞻匹配需要后面跟着另一个字符串吗?

无论如何:

  • \s 只需要 一个且只有一个 空格;
  • \s+ 至少需要 一个 空格。

没错,前瞻匹配在 Python 2.x 中也接受 "+" 修饰符。

和之前一样,但加上了前瞻匹配:

re.findall(r'([\w\s]*[\?\!\.;])(?=\s\w)', s)

或者

re.findall(r'([\w\s]*[\?\!\.;])(?=\s+\w)', s)

你可以在类似下面的内容上尝试它们:

s='Stefano ciao.   a domani. a presto;'

根据你的字符串,前瞻匹配可能是必要的,也可能不是,使用 "+" 可能会改变,允许多个空格的选项。

2

这两者的区别在于,第一个前瞻(lookahead)要求在数字或大写字母前面有恰好一个空格字符,而第二个前瞻则要求至少有一个空格字符,但可以有更多。

这里的 + 被称为量词。它的意思是可以有1个到多个,尽可能多。

总结一下

\s (Exactly one whitespace character allowed. Will fail without it or with more than one.)
\s+ (At least one but maybe more whitespaces allowed.)

进一步学习。

I have multiple blanks, the \w.+? continues to match the blanks until the last blank before the capital letter

要回答这个评论,请考虑:

\w.+? 实际上匹配什么?

它匹配单个的单词字符 [a-zA-Z0-9_],后面跟着至少一个“任意”字符(除了换行符),但使用的是懒惰量词 +?。所以在你的例子中,它留了一个空格,以便后面的前瞻可以匹配。因此,你消耗了所有的空格,除了一个。这就是为什么你在输出中看到它们的原因。

撰写回答