Ваши первые два предложения противоречат друг другу. «в \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 (HANGZHOU NUMERAL ONE) обрабатывается как числовой (следовательно, он соответствует \ w), но кажется, что Python интерпретирует «цифра» как «десятичная цифра» (категория Nd), поэтому он не соответствует \ d
U + 2438 (ЗАПИСЬ МАЛЕНЬКОГО ЛАТИНСКОГО Y) не соответствует \ w
Все иероглифы CJK классифицируются как "буквы" и, таким образом, соответствуют \ w
Независимо от того, является ли какой-либо из вышеперечисленных пунктов проблемой, или нет, такой подход является лучшим, что вы получите из модуля re, выпущенного в настоящее время. Синтаксис типа \ p {letter} находится в будущем.