Python regexp\w

Python regexp\w,python,regex,Python,Regex,各国: 8位字节模式的特殊序列\w与字符匹配 在ASCII字符集中被视为字母数字;这相当于 [a-zA-Z0-9] 现在比较: re.search(r"([\w]+)", 'München').group(1) 与: 第一条语句输出整个城市名München,第二条语句仅输出第一个字母M。字母U是一个单字节,代码点0xFC=252拉丁-1。 我的问题是:假设Python手册是正确的,我如何将[\w]+和[a-zA-Z0-9_3;]+之间的输出差异与Python-3手册中的语句相协调?我用空闲的v

各国:

8位字节模式的特殊序列\w与字符匹配 在ASCII字符集中被视为字母数字;这相当于 [a-zA-Z0-9]

现在比较:

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

第一条语句输出整个城市名München,第二条语句仅输出第一个字母M。字母U是一个单字节,代码点0xFC=252拉丁-1。
我的问题是:假设Python手册是正确的,我如何将[\w]+和[a-zA-Z0-9_3;]+之间的输出差异与Python-3手册中的语句相协调?我用空闲的v。3.6.2.

我不确定你的报价来源,但你的链接上说:

对于Unicode str模式:

匹配Unicode单词字符;这包括任何语言中可以作为单词一部分的大多数字符,以及数字和下划线。如果使用ASCII标志,则只匹配[a-zA-Z0-9_u3;],但该标志会影响整个正则表达式,因此在这种情况下,使用显式[a-zA-Z0-9_3;]可能是更好的选择

对于8位字节模式:

匹配ASCII字符集中被视为字母数字的字符;这相当于[a-zA-Z0-9]


我仍然主要使用Python2,但Python3的一个重大变化是默认情况下所有字符串都是Unicode。Python将在阅读时将文本转换为Unicode。

您引用了错误的Python 3.1手册

正确的答案在

如果您希望\w像[a-zA-Z0-9_]一样工作,则应使用re.ASCII标志:


默认情况下启用re.U标志=\w匹配Python 3中的任何Unicode字母和数字。默认情况下,Python3字符串是Unicode字符串,而不是字节字符串。手册中应该没有提到re.U标志吗?你到底需要什么?在Python 3中是否始终只匹配[A-Za-z0-9_u2;]?然后传递re.ASCII标志。@P.Wormer手册确实提到了这一点。你只是没有读到正确的部分。你没有使用字节,那么为什么要引用字节部分呢?我编写了一个小Python程序,用拉丁语1计算文本中的单词。文本包含128到255个重音字符之间的单字节字符。令我惊讶的是\w+完全按照我的要求使用重音字符计数单词。现在我试着去理解发生了什么。我确信我正在读的文本是拉丁文1。文本实际上比Unicode旧。也许Python在阅读Maybe?时会在某个地方转换它。好吧,答案是:我无意中使用了UTF-8,应该意识到re.U标志是打开的。谢谢大家!!
re.search(r"([a-zA-Z0-9_]+)", 'München').group(1)  
>>> 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'