python-re:我如何匹配alpha字符

bas*_*ndi 30 python regex unicode regex-negation

如何将alpha字符与正则表达式匹配.我想要一个在\w但不在的角色\d.我希望它与unicode兼容,这就是我无法使用的原因[a-zA-Z].

Joh*_*hin 50

你的前两句话相互矛盾."在\w但不在\d"包括下划线.我从你的第三句话中假设你不想要下划线.

在信封背面使用维恩图有助于.让我们来看看我们不想要的东西:

(1)不匹配的字符\w(即不想要任何不是字母,数字或下划线的字符)=> \W
(2)digits => \d
(3)下划线=>_

所以我们不想要的是角色类中的任何东西[\W\d_],因此我们想要的是角色类中的任何东西[^\W\d_]

这是一个简单的例子(Python 2.6).

>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']
Run Code Online (Sandbox Code Playgroud)

进一步的探索揭示了这种方法的一些怪癖:

>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
...     print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']
Run Code Online (Sandbox Code Playgroud)

U + 3021(杭州数字1)被视为数字(因此它匹配\ w)但似乎Python将"数字"解释为"十进制数字"(类别Nd),因此它与\ d不匹配

U + 2438(圆形拉丁文小写字母Y)与\ w不匹配

所有CJK表意文字都被归类为"字母",因此匹配\ w

无论上述3点中的任何一点是否值得关注,这种方法都是目前发布的最佳模块.将来会出现像\ p {letter}这样的语法.