为什么这两个表达式会返回相同的输出?
phillip = '#awesome '
nltk.re_show('\w+|[^\w\s]+', phillip)
VS
nltk.re_show('\w+|[^\w]+', phillip)
两者都返回:
{#}{awesome}
为什么第二个不返回
{#}{awesome}{ }?
答案 0 :(得分:1)
这似乎是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
会这样做,这对我来说似乎是个错误......
答案 1 :(得分:-1)
\w
看起来与[A-Za-z0-9_]
匹配。因为你正在寻找一个或另一个(1 +&#34;字&#34;字符或1 +非 - &#34;字&#34;字符),它将第一个字符与\w
匹配角色并继续前进直到遇到不匹配。
如果您进行全局匹配,您会看到另一个匹配包含空格(第一个非&#34;单词&#34;字符)。