【问题标题】:Does regex automatically ignore trailing whitespace?正则表达式会自动忽略尾随空格吗?
【发布时间】:2014-05-20 10:28:03
【问题描述】:

为什么这两个表达式返回相同的输出?

phillip = '#awesome '

nltk.re_show('\w+|[^\w\s]+', phillip)

对比

nltk.re_show('\w+|[^\w]+', phillip)

两者都返回:

{#}{awesome}

为什么第二个不返回

{#}{awesome}{ }?

【问题讨论】:

    标签: python regex nltk


    【解决方案1】:

    \w 看起来与 [A-Za-z0-9_] 匹配。并且由于您正在寻找一个或另一个(1+“单词”字符或 1+ 个非“单词”字符),它将第一个字符匹配为 \w 字符并继续运行,直到遇到不匹配 @ 987654326@.

    如果您进行全局匹配,您将看到另一个匹配包含空格(第一个非“单词”字符)。

    【讨论】:

    • 从返回的结果来看,他似乎在进行全局匹配(注意它是如何匹配数字符号和单词“awesome”的)。他的第二个模式\w+|[^\w]+ 匹配一个或多个单词字符的字符串,或者一个或多个否定单词字符的字符串,因此理论上它应该匹配` `。当我在 regex101 中尝试时,该模式似乎有效,所以我不确定 OP 的问题是什么。
    • 他已经在进行全局匹配,#awesome 分别匹配就证明了这一点。第一个字符是“#”,这绝对是一个非单词字符。
    • 好点,是的,我想知道问题出在哪里。 Regex101 工作正常(我添加了一个捕获组,以便更容易看到)。
    【解决方案2】:

    看来nltk 在应用正则表达式之前会右剥离字符串中的空格。

    the source code(或者你可以import inspectprint inspect.get_source(nltk.re_show)

    def re_show(regexp, string, left="{", right="}"):
        """docstring here -- I stripped it for  brevity"""
        print(re.compile(regexp, re.M).sub(left + r"\g<0>" + right, string.rstrip()))
    

    尤其是string.rstrip(),它会去除所有尾随空格。

    例如,如果您确保 phillip 字符串的右侧没有空格:

    nltk.re_show('\w+|[^\w]+', phillip + '.')
    # {#}{awesome}{ .}
    

    不知道为什么nltk 会这样做,这对我来说似乎是一个错误......

    【讨论】:

    • 谢谢!我同意,这似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2021-09-13
    • 2020-08-06
    • 2011-08-12
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多