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)