正则表达式'w+'应该只返回英语单词,但它的工作方式不同


s = 'ಆತಂಕವಾದಿಗಳಿಗೆ ವಿಶೇಷ ರಕ್ಷಣೆ ನೀಡುತ್ತದೆ, 24 ಕ್ಕೂ ಹೆಚ್ಚು ಹಿಂದೂ ಕಾರ್ಯಕರ್ತರ ಹತ್ಯೆಯಾದರೂ I am working on this'
words = re.findall(r'w+',s)
print(words)

我原以为上面的代码只返回英语单词,但我得到了以下内容。

['ಆತ', 'ಕವ', 'ದ', 'ಗಳ', 'ಗ', 'ವ', 'ಶ', 'ಷ', 'ರಕ', 'ಷಣ', 'ನ', 'ಡ', 'ತ', 'ತದ',
'24', 'ಕ', 'ಕ', 'ಹ', 'ಚ', 'ಚ', 'ಹ', 'ದ', 'ಕ', 'ರ', 'ಯಕರ', 'ತರ', 'ಹತ', 'ಯ',
'ಯ', 'ದರ', 'I', 'am', 'working', 'on', 'this']

有人能解释一下这是怎么回事吗?

我不知道你为什么期望w+只匹配英语单词。它甚至在ASCII模式下都不会这样做。它匹配任何w字符序列,文档描述w:的实际行为

对于Unicode(str(模式:
匹配Unicode单词字符;这包括在任何语言中可以成为单词一部分的大多数字符,以及数字和下划线。如果使用ASCII标志,则只匹配[a-zA-Z0-9_]。

对于8位(字节(模式:
匹配ASCII字符集中被视为字母数字的字符;这相当于[a-zA-Z0-9_]。如果使用LOCALE标志,则匹配当前区域设置中被视为字母数字的字符和下划线。

遗憾的是,文档没有比这更具体的内容,但w绝对不限于英语。

如果您想要[a-zA-Z0-9_],您可以显式地写出您想要的字符类,也可以使用re.ASCII标志。如果您想要[a-zA-Z],请明确地写出来。

我无法重现您的观察结果,请参阅演示。也许你端有一些编码问题,这就是w使用泰米尔语字符的原因。但是,您可以在这里使用的一种变通方法是明确地拼写出字符类w的实际组成:

words = re.findall(r'[A-Za-z0-9_]+', s)
print(words)
words = re.findall(r'w+',s)

w+无法获取所需内容的原因是它缺少Unicode标志。这里的其他答案忽略了编码,只需简单地说他们正在寻找哪些特定的字母

\w

如果未指定LOCALE和UNICODE标志,则匹配任何字母数字字符和下划线;这相当于设置[a-zA-Z0-9_]。使用LOCALE,它将匹配集合[0-9_]加定义为当前的字母数字的任何字符场所如果设置了UNICODE,这将匹配字符[0-9_]加在Unicode字符中被分类为字母数字的内容属性数据库。

这就是原因。

按照下面给出的方式修改代码,以了解为什么会这样打印:

s = u'ಆತಂಕವಾದಿಗಳಿಗೆ ವಿಶೇಷ ರಕ್ಷಣೆ ನೀಡುತ್ತದೆ, 24 ಕ್ಕೂ ಹೆಚ್ಚು ಹಿಂದೂ ಕಾರ್ಯಕರ್ತರ ಹತ್ಯೆಯಾದರೂ I am 
working on this'
words = re.findall(r'w+',s)
print(words)

for letter in s:
print(letter)

输出

['ಆತ', 'ಕವ', 'ದ', 'ಗಳ', 'ಗ', 'ವ', 'ಶ', 'ಷ', 'ರಕ', 'ಷಣ', 'ನ', 'ಡ', 'ತ', 'ತದ', '24', 'ಕ', 'ಕ', 'ಹ', 'ಚ', 'ಚ', 'ಹ', 'ದ', 'ಕ', 'ರ', 'ಯಕರ', 'ತರ', 'ಹತ', 'ಯ', 'ಯ', 'ದರ', 'I', 'am', 'working', 'on', 'this']
ಆ
ತ
ಂ 
ಕ
ವ
ಾ  
ದ
ಗ
ಳ
ಗ

ವ
ಶ
ೇ
ಷ
ರ
ಕ
ಷ
ಣ

ನ
ೀ
ಡ
ು
ತ
ತ
ದ
,
2
4
ಕ
ಕ
ೂ
ಹ
ಚ
ಚ
ು
ಹ
ಂ
ದ
ೂ
ಕ
ಾ
ರ
ಯ
ಕ
ರ
ತ
ರ
ಹ
ತ
ಯ
ಯ
ಾ
ದ
ರ
ೂ
I
a
m
w
o
r
k
i
n
g
o
n
t
h
i
s

这些圆圈是一种空间[正如代码所理解的]

看看@itzMEonTV的建议:

In [46]: rex=re.compile(r'w+')                                                                                               
In [47]: rex                                                                                                                  
Out[47]: re.compile(r'w+', re.UNICODE)

最新更新