2010-08-25 4 views

ответ

5
>>> import re 
>>> test = "i am test-ing., i am test.ing-, i am_, test_ing," 
>>> re.sub(r'([^\w\s]|_)+(?=\s|$)', '', test) 
'i am test-ing i am test.ing i am test_ing' 

Матчи один или более не алфавитно-цифровые символы ([^\w\s]|_) за которым следует либо пробел (\s), либо конец строки ($). Конструкция (?=) - это утверждение lookahead: оно гарантирует, что совпадающее пространство не будет включено в совпадение, поэтому оно не будет заменено; заменяется только [\W_]+.

Хорошо, но почему [^\w\s]|_, спросите вы? Первая часть соответствует любому, что не является буквенно-цифровым или подчеркиванием ([^\w]) или пробелом ([^\s]), то есть символами пунктуации. Кроме того, мы хотим исключить символы подчеркивания, поэтому мы включаем их с |_.

+0

John: спасибо за ответ, я хотел бы знать, в чем разница между $ и \ Z? – killown

+1

-1 Обычно (без MULTILINE) есть * * разность; '$' perlishly соответствует концу входной строки ИЛИ NEWLINE В КОНЕЦ СТРОКИ. '\ Z' соответствует только в конце строки, что обычно является желаемым поведением. –

+1

точнее: «ИЛИ непосредственно перед NEWLINE AT ...» –

Смежные вопросы