【问题标题】:Python regex positive look aheadPython正则表达式积极展望
【发布时间】:2011-11-09 17:55:22
【问题描述】:

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

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

下面的lookahead的作用是什么?

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

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

【问题讨论】:

  • 抱歉我的问题搞砸了。
  • 你仍然缺少闭合的圆形刹车!
  • 您应该发布一些您希望使用的字符串示例,以及您如何使用 re 模块搜索/匹配/查找它们

标签: python regex


【解决方案1】:

我不太确定你想在这里实现什么。

以标点符号结尾的单词序列可以与以下内容匹配:

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】:

    不同之处在于,第一个前瞻要求在数字或大写字母之前恰好一个空格字符,而第二个前瞻要求至少一个空格字符但尽可能多.

    + 称为量词。这意味着尽可能多的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_] 后跟至少一个“任何”字符(换行符除外),但带有 惰性 量词 +? .因此,在您的情况下,它会留下一个空格,以便稍后匹配。因此,您消耗了除一个之外的所有空白。这就是您在输出中看到它们的原因。

    【讨论】:

    • 感谢 FailedDev。当我只用 \s 运行正则表达式并且我有多个空格时,\w.+?继续匹配空格,直到大写字母前的最后一个空格。在我的结果中,我得到一个带有空白的文本,例如:“汽车停在了----”,“在车库里”(--象征空白)。如果我在前瞻中有 \s+,则不会捕获额外的空白,并且我会得到“汽车已停放”,“在车库中”。不管我在单词之间有多少空格。 python 3支持变量前瞻是否正确?
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多