【问题标题】:Finding all words: Negative Look Behind in Regex查找所有单词:Regex 中的否定查找
【发布时间】:2017-09-10 18:37:27
【问题描述】:

我目前正在使用 Python 2.7(我正在使用我的一些旧代码)。我正在尝试通过正则表达式获取所有单词,在这里我可以忽略带有撇号的单词,例如can't 和Gary's。到目前为止,我已将字符串中的所有字母都设为小写,这是我当前的正则表达式:

r"(?<=\s|^)([a-z]+)(?=\s|$)"

我收到以下错误:

引发错误,v # 表达式无效

错误:后视需要固定宽度的模式

我也试过了:

r"(?:\s|^)([a-z]+)(?=\s|$)"

但是,正如您在 Regex101 上看到的那样,它没有捕捉到最后一个单词。

我知道这样做可能有更好的选择,但现在我真的很好奇如何在这种情况下进行负面观察。但是,如果您能解释这一点并提供您自己更好的解决方案,那就太好了。

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

    在这种情况下,只需对相反的字符类\S 使用否定的lookbehind(前瞻也可以这样做):

    r"(?<!\S)([a-z]+)(?!\S)"
    

    请参阅regex demo。

    “积极”的方法看起来不那么漂亮:

    r"(?:(?<=\s)|^)([a-z]+)(?=\s|$)"
    

    见another regex demo。 (?:(?&lt;=\s)|^) 非捕获组结合了 2 个零宽度断言替代方案,(?&lt;=\s) 需要在当前位置之前有一个空格,^ 匹配字符串的开头。

    【讨论】:

    • 有没有不使用负片的方法?我很好奇,以防我以后遇到类似的问题。
    • 是的,但是看起来不整齐。
    • 如果问的不是太多,你能不能也顺便贴一下?
    • 请注意,您也可以使用re.I 标志将大小写ASCII 字母与[a-z] 匹配。此外,您可以改用[^\W\d_],它只会匹配字母,如果您使用re.U 标志,它也会匹配所有Unicode 字母。
    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多