能否将[a-zA-Z] Python正则表达式模式匹配和替换非ASCII Unicode字符?

5
在下面的正则表达式中,我希望将字符串中的每个字符替换为'X',但它没有起作用。
在Python 2.7中:
>>> import re
>>> re.sub(u"[a-zA-Z]","X","dfäg")
'XX\xc3\xa4X'

或者

>>> re.sub("[a-zA-Z]","X","dfäg",re.UNICODE)
u'XX\xe4X'

在Python 3.4中:
>>> re.sub("[a-zA-Z]","X","dfäg")
'XXäX'

有没有办法“配置”[a-zA-Z]模式来匹配“ä”,“ü”等字符?如果无法这样做,如何创建类似的字符范围模式,包括Unicode字符在正常的“完整字母表”范围内?我的意思是,在德语这样的语言中,“ä”将被放置在字母表中靠近“a”的位置,因此人们希望它包含在“a-z”范围内。


使用 \w 应该就够了。 - Wiktor Stribiżew
如果我理解问题正确,\w将排除任何不在集合[A-Za-z]中的字母。我在这里尝试过了(https://regex101.com/r/rR2hZ1/1)。 - npinti
@npinti:使用Unicode修饰符,它可以匹配带重音的字母 - Wiktor Stribiżew
有趣的是,使用带有u标志的\w会将\w从意味着[A-Za-z0-9_]更改为包括\p{L}的其他内容。奇怪的是,在Python中似乎不支持单独使用\p{L} - npinti
1
@DhaLee:没问题,你可以使用(?![\d_])\w - Wiktor Stribiżew
@DhaLee: 使用Unicode标记的\w可以实现你想要的功能。 - npinti
1个回答

7

您可以使用

(?![\d_])\w
[^\W\d_]

如果在Python 2.x中使用,则需要使用re.U / re.UNICODE修改器。(?![\d_])前瞻限制了\w简写类,使其无法匹配任何数字(\d)或下划线。[^\W\d_]模式匹配除数字和下划线之外的任何单词字符。
请参见正则表达式演示Python 3演示:
import re
print (re.sub(r"(?![\d_])\w","X","dfäg"))
# => XXXX

print (re.sub(r"[^\W\d_]","X","dfäg"))
# => XXXX

关于 Python 2

# -*- coding: utf-8 -*-
import re
s = "dfäg"
w = re.sub(ur'(?![\d_])\w', u'X', s.decode('utf8'), 0, re.UNICODE).encode("utf8")
print(w)

1
仅供参考:在Windows上,在Python 2.x中,可以添加“#coding:utf-8”指令来强制使用UTF8编码源代码。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接