爲什麼這兩個表達式返回相同的輸出?是否正則表達式會自動忽略尾隨空格?
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}{ }?
看起來這是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
做到這一點,好像我...
\w
看起來匹配[A-Za-z0-9_]
。而且,由於您正在尋找一個或另一個(1+「單詞」字符或1 +非「單詞」字符),因此它將匹配第一個字符作爲\w
字符並繼續前進,直到遇到不匹配。
如果您進行全局匹配,您將看到包含空格的另一個匹配項(第一個非「字」字符)。
從返回的結果來判斷,看起來他正在進行全局匹配(注意它如何匹配數字符號和單詞「awesome」)。他的第二個模式'\ w + | [^ \ w] +'匹配一個或多個單詞字符串,或者一個或多個否定單詞字符串,因此理論上它應該匹配''。當我在regex101中嘗試它時,該模式似乎正在工作,所以我不確定OP的問題是什麼。 – CAustin
他已經在進行全局比賽,正如'#'和'awesome'分別匹配一樣。第一個字符是'#',它絕對是一個非單詞字符。 –
好點,是啊,我想知道問題是什麼。 [Regex101](http://regex101.com/r/lL1lI7)它工作正常(我添加了一個捕獲組,因此更容易看到)。 – Sam
謝謝!我同意,這似乎很奇怪。 – prpole