【发布时间】:2014-05-20 10:28:03
【问题描述】:
为什么这两个表达式返回相同的输出?
phillip = '#awesome '
nltk.re_show('\w+|[^\w\s]+', phillip)
对比
nltk.re_show('\w+|[^\w]+', phillip)
两者都返回:
{#}{awesome}
为什么第二个不返回
{#}{awesome}{ }?
【问题讨论】:
为什么这两个表达式返回相同的输出?
phillip = '#awesome '
nltk.re_show('\w+|[^\w\s]+', phillip)
对比
nltk.re_show('\w+|[^\w]+', phillip)
两者都返回:
{#}{awesome}
为什么第二个不返回
{#}{awesome}{ }?
【问题讨论】:
\w 看起来与 [A-Za-z0-9_] 匹配。并且由于您正在寻找一个或另一个(1+“单词”字符或 1+ 个非“单词”字符),它将第一个字符匹配为 \w 字符并继续运行,直到遇到不匹配 @ 987654326@.
如果您进行全局匹配,您将看到另一个匹配包含空格(第一个非“单词”字符)。
【讨论】:
\w+|[^\w]+ 匹配一个或多个单词字符的字符串,或者一个或多个否定单词字符的字符串,因此理论上它应该匹配` `。当我在 regex101 中尝试时,该模式似乎有效,所以我不确定 OP 的问题是什么。
# 和 awesome 分别匹配就证明了这一点。第一个字符是“#”,这绝对是一个非单词字符。
看来nltk 在应用正则表达式之前会右剥离字符串中的空格。
见the source code(或者你可以import inspect和print 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 会这样做,这对我来说似乎是一个错误......
【讨论】: