Python正则表达式积极向前看

时间:2011-11-09 17:55:23

标签: python regex

我有以下正则表达式,它应该找到以标点符号结尾的单词序列。前瞻功能确保在比赛后有空格和大写字母或数字。

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

以下前瞻的功能是什么?

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

Python 3.2支持变量预测(\ s +)吗?我没有得到任何错误。此外,我看不出两种模式有任何差异。无论我有多少空白,两者似乎都是一样的。在前瞻中是否有关于\ s +目的的解释?

2 个答案:

答案 0 :(得分:2)

不同之处在于,第一个前瞻在数字或大写字母之前需要完全一个空白字符,而第二个预期至少有一个空白字符但是尽可能多

+被称为量词。它意味着尽可能多的1到n。

回顾一下

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

Further studying.

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

要回答此评论,请考虑:

\ w。+?实际上匹配?

单个字符[a-zA-Z0-9_]后跟至少一个“任意”字符(换行符除外),但 lazy 量词+? 。因此,在您的情况下,它会留下一个空格,以便以后的前瞻匹配。因此,除了一个空白之外,您将消耗所有空白。这就是你在输出中看到它们的原因。

答案 1 :(得分: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;'

根据您的字符串,可能需要或不需要前瞻,并且可能会或可能不会更改为具有“+”多个空格选项。