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

Python 正则表达式'\w+';应该只返回英文单词,但它的工作方式不同,python,regex,Python,Regex,我希望上面的代码只返回英文单词,但我得到的结果如下 s = 'ಆತಂಕವಾದಿಗಳಿಗೆ ವಿಶೇಷ ರಕ್ಷಣೆ ನೀಡುತ್ತದೆ, 24 ಕ್ಕೂ ಹೆಚ್ಚು ಹಿಂದೂ ಕಾರ್ಯಕರ್ತರ ಹತ್ಯೆಯಾದರೂ I am working on this' words = re.findall(r'\w+',s) print(words) 有人能解释一下这是怎么回事吗?我无法重现你的观察结果。也许你这边有一些编码问题,这就是为什么\w开始使用泰米尔语字符的原因。但是,您可以在这里使用

我希望上面的代码只返回英文单词,但我得到的结果如下

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

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

我无法重现你的观察结果。也许你这边有一些编码问题,这就是为什么
\w
开始使用泰米尔语字符的原因。但是,您可以在这里使用的一种解决方法是明确说明字符类
\w
实际包含的内容:

['ಆತ', 'ಕವ', 'ದ', 'ಗಳ', 'ಗ', 'ವ', 'ಶ', 'ಷ', 'ರಕ', 'ಷಣ', 'ನ', 'ಡ', 'ತ', 'ತದ',
    '24', 'ಕ', 'ಕ', 'ಹ', 'ಚ', 'ಚ', 'ಹ', 'ದ', 'ಕ', 'ರ', 'ಯಕರ', 'ತರ', 'ಹತ', 'ಯ',
    'ಯ', 'ದರ', 'I', 'am', 'working', 'on', 'this']
\w+
无法获取所需内容的原因是缺少Unicode标志。这里的其他答案忽略了编码,只是简单地说出了他们要查找的特定字母

\w

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


这就是为什么。

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

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

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

不幸的是,这些文档没有比这更具体的内容,但是
\w
肯定不限于英语


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

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

words = re.findall(r'\w+',s)
输出

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


for letter in s:
    print(letter)

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

看看@itzMEonTV的建议:

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

ಗ
ಳ

ಗ


ವ

ಶ
ೇ
ಷ

ರ
ಕ

ಷ
ಣ


ನ
ೀ
ಡ
ು
ತ

ತ
ದ

,

2
4

ಕ

ಕ
ೂ

ಹ

ಚ

ಚ
ು

ಹ

ಂ
ದ
ೂ

ಕ
ಾ
ರ

ಯ
ಕ
ರ

ತ
ರ

ಹ
ತ

ಯ

ಯ
ಾ
ದ
ರ
ೂ

I

a
m

w
o
r
k
i
n
g

o
n

t
h
i
s

大家注意:OP的代码出现了。我只能推测,有一些奇怪的编码问题发生了。@TimBiegeleisen看起来您链接的演示使用的是Python 2,但我猜Amarnath使用的是Python 3,这确实显示了这个问题。Amarnath,你能编辑这个问题来确认你使用的是哪个版本的Python吗?“我希望上面的代码只返回英文单词”-为什么?
re.findall(r'\w+',s,re.ASCII)
words=re.sub(r'[^a-zA-Z]','',s)
sub工作正常,但在findall中有所不同。我不确定为什么我认为你的想法正确,但有点倒退;事实上,问题似乎是OP的代码示例中的
\w
所收集的不仅仅是
[a-zA-Z0-9.]
。我相信区别在于您在这里所说的适用于Python 2,但我怀疑问题中的代码是要与Python 3一起运行的。。尽管这可能只是一个本地化问题,如上所述。。可能需要更彻底的调查。好吧,我不能排除这一点,但我更确信这是一个2对3的问题,因为在Python 3中运行OP的代码示例会重现问题,但在Python 2中运行它不会,而且您的引用来自Python 2文档,描述OP所看到的相反行为,也就是说,如果在Python 2下运行他们的代码示例,将会发生什么。
['ಆತ', 'ಕವ', 'ದ', 'ಗಳ', 'ಗ', 'ವ', 'ಶ', 'ಷ', 'ರಕ', 'ಷಣ', 'ನ', 'ಡ', 'ತ', 'ತದ', '24', 'ಕ', 'ಕ', 'ಹ', 'ಚ', 'ಚ', 'ಹ', 'ದ', 'ಕ', 'ರ', 'ಯಕರ', 'ತರ', 'ಹತ', 'ಯ', 'ಯ', 'ದರ', 'I', 'am', 'working', 'on', 'this']
ಆ
ತ
ಂ 
ಕ
ವ
ಾ  
ದ

ಗ
ಳ

ಗ


ವ

ಶ
ೇ
ಷ

ರ
ಕ

ಷ
ಣ


ನ
ೀ
ಡ
ು
ತ

ತ
ದ

,

2
4

ಕ

ಕ
ೂ

ಹ

ಚ

ಚ
ು

ಹ

ಂ
ದ
ೂ

ಕ
ಾ
ರ

ಯ
ಕ
ರ

ತ
ರ

ಹ
ತ

ಯ

ಯ
ಾ
ದ
ರ
ೂ

I

a
m

w
o
r
k
i
n
g

o
n

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