Как исключить символ из группы регулярных выражений?

Я хочу удалить все не-буквенно-цифровые символы. ИСКЛЮЧИТЕ дефис из строки (python). Как изменить это регулярное выражение в соответствии с любым не-буквенно-цифровым char, кроме дефиса?

re.compile('[\W_]')

Спасибо.

Ответы

Ответ 1

Вместо этого вы можете использовать отрицательный класс символов:

re.compile(r"[^a-zA-Z0-9-]")

Это будет соответствовать всем, что не соответствует буквенно-цифровым диапазонам или дефису. Он также соответствует подчеркиванию в соответствии с вашим текущим регулярным выражением.

>>> r = re.compile(r"[^a-zA-Z0-9-]")
>>> s = "some#%te_xt&with--##%--5 hy-phens  *#"
>>> r.sub("",s)
'sometextwith----5hy-phens'

Обратите внимание, что это также заменяет пробелы (что, безусловно, может быть тем, что вы хотите).


Изменить: SilentGhost предположил, что, возможно, для процессора будет более выгодно обрабатывать квантификатор, и в этом случае вы можете просто использовать:

re.compile(r"[^a-zA-Z0-9-]+")

+ будет просто приводить к тому, что все последовательности последовательно совпадающих символов будут совпадать (и будут заменены) одновременно.

Ответ 2

\w соответствует буквенно-цифровым символам, добавляет в дефис, затем отменяет весь набор: r"[^\w-]"