Python 正则表达式正向前瞻
我有一个正则表达式,它的作用是找到以标点符号结尾的单词序列。这个“向前看”的功能确保在匹配的内容后面有一个空格和一个大写字母或数字。
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_],后面跟着至少一个“任意”字符(除了换行符),但使用的是懒惰量词 +?。所以在你的例子中,它留了一个空格,以便后面的前瞻可以匹配。因此,你消耗了所有的空格,除了一个。这就是为什么你在输出中看到它们的原因。