您的前两个句子相互矛盾。“在
w但不在
d”中包括下划线。我假设从您的第三句话开始,您不想下划线。
使用信封背面的维恩图会有所帮助。让我们看看我们不想要的:
(1)不匹配的字符
w(即,不需要字母,数字或下划线的任何内容)=>
W
(2)数字=>
d
(3)下划线=>
_
所以我们不需要的是角色类中的任何东西
[Wd_],因此我们想要的是角色类中的任何东西
[^Wd_]
这是一个简单的示例(Python 2.6)。
>>> import re>>> rx = re.compile("[^Wd_]+", re.UNICODE)>>> rx.findall(u"abc_def,k9")[u'abc', u'def', u'k']进一步的探索揭示了这种方法的一些怪癖:
>>> import unipredata as ucd>>> allsorts =u"u0473u0660u06c9u24e8u4e0au3020u3021">>> for x in allsorts:... print repr(x), ucd.category(x), ucd.name(x)...u'u0473' Ll CYRILLIC SMALL LETTER FITAu'u0660' Nd ARABIC-INDIC DIGIT ZEROu'u06c9' Lo ARABIC LETTER KIRGHIZ YUu'u24e8' So CIRCLED LATIN SMALL LETTER Yu'u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0Au'u3020' So POSTAL MARK FACEu'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}之类的语法。



