您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python-re:如何匹配字母字符

python-re:如何匹配字母字符

您的前两个句子相互矛盾。“在\w但不在\d”中包括下划线。我假设从您的第三句话开始,您不想下划线。

使用信封背面的维恩图会有所帮助。让我们看看我们不想要的:

(1)不匹配的字符\w(即,不需要字母,数字或下划线的任何内容)=> \W (2)数字=> \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']

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

>>> 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']

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

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

所有CJK表意文字均归类为“字母”,因此与\ w

无论上述3点中的任何一个是否值得关注,该方法都是您最好脱离当前发布的re模块的最佳方法。将来会使用\ p {letter}之类的语法。

python 2022/1/1 18:28:37 有210人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶