2017-08-16 52 views
0

Python manual狀態:Python的正則表達式 W

特殊序列\ W爲8位(字節)的圖案相匹配的字符的ASCII字符集 考慮字母數字;這相當於 [a-zA-Z0-9_]。

現在比較:

re.search(r"([\w]+)", 'München').group(1) 

有:

re.search(r"([a-zA-Z0-9_]+)", 'München').group(1) 

第一條語句輸出整個城市的名字慕尼黑,僅次於第一個字母M。字母ü是一個單字節,代碼點爲0xFC = 252(Latin-1)。 我的問題是:假設Python手冊是正確的,我如何使用Python-3手冊中的語句來協調[\w]+[a-zA-Z0-9_]+之間的輸出差異?我使用IDLE v。3.6.2。

+4

're.U'標誌默認情況下(啓用='\ W '匹配任何Unicode字母和數字)。默認情況下,Python 3字符串是Unicode字符串,而不是字節字符串。 –

+0

但我使用拉丁文-1,而不是UTF-8。手冊不應該提及re.U標誌嗎? –

+2

你究竟需要什麼?讓'\ w'總是隻匹配Python 3中的[A-Za-z0-9_]'?然後通過're.ASCII'標誌。 –

回答

-2

我不知道你是從什麼引用來源,但你的鏈接說:

對於Unicode(STR)模式:

匹配的Unicode字符字;這包括大多數可以是任何語言的單詞的一部分的字符,以及數字和下劃線。如果使用ASCII標誌,只匹配[a-zA-Z0-9_](但該標誌影響整個正則表達式,因此在這種情況下,使用明確的[a-zA-Z0-9_]可能是更好的選擇)。

對於8位(字節)模式:認爲字母數字的ASCII字符集

匹配字符;這相當於[a-zA-Z0-9_]。

我仍然主要使用Python 2,但Python 3中的一個重大變化是所有字符串默認都是Unicode。 Python會在閱讀文本時將文本轉換爲Unicode。

+0

我確定我正在閱讀的文字是Latin-1。文本實際上比Unicode更早。也許Python將它轉換到某處(閱讀也許?)。 –

+0

是的,Python在閱讀文本時將其轉換。 –

+0

好吧,這就是答案:無意中我使用UTF-8並應該意識到re.U標誌已打開。謝謝你們! –

0

你引用了錯誤的手冊(手冊爲python 3.1)。

正確的是https://docs.python.org/3/library/re.html

如果你想\w工作像[a-zA-Z0-9_],你應該使用標誌re.ASCII

>>> re.search(r"([\w]+)", 'München').group(1) 
'München' 
>>> re.search(r"([\w]+)", 'München', flags=re.ASCII).group(1) 
'M' 
>>> re.search(r"([a-zA-Z0-9_]+)", 'München').group(1) 
'M'