【发布时间】:2014-12-21 10:27:51
【问题描述】:
我想替换所有 \W 而不是字母,除了 - 破折号到空格,即:
-
black-white会给black-white -
black#white会给black white
我非常了解正则表达式,但我不知道如何处理它。
考虑到我想使用 Unicode,所以 [a-zA-Z] 不是 \w 就像只有英文一样。
考虑到我更喜欢 Python re 语法,但可以阅读其他建议。
【问题讨论】:
我想替换所有 \W 而不是字母,除了 - 破折号到空格,即:
black-white 会给black-white
black#white 会给black white
我非常了解正则表达式,但我不知道如何处理它。
考虑到我想使用 Unicode,所以 [a-zA-Z] 不是 \w 就像只有英文一样。
考虑到我更喜欢 Python re 语法,但可以阅读其他建议。
【问题讨论】:
使用否定字符类:(\W 等价于[^\w];[^-\w] => \W 除了-)
>>> re.sub(r'[^-\w]', ' ', 'black-white')
'black-white'
>>> re.sub(r'[^-\w]', ' ', 'black#white')
'black white'
如果你使用regex包,你可以使用nested sets, set operations:
>>> import regex
>>> print regex.sub(r'(?V1)[\W--[-]]', ' ', 'black-white')
black-white
>>> print regex.sub(r'(?V1)[\W--[-]]', ' ', 'black#white')
black white
【讨论】:
我会使用negative lookahead,如下所示,
>>> re.sub(r'(?!-)\W', r' ', 'black-white')
'black-white'
>>> re.sub(r'(?!-)\W', r' ', 'black#white')
'black white'
(?!-)\W 开头的否定前瞻断言我们要匹配的字符将是 \W(非单词字符列表)中的任何字符,但不是连字符 - 中的任何字符。这就像一种减法,即\W - character present inside the negative lookahead(即连字符)。
【讨论】:
-(*SKIP)(*F)|\W regex101.com/r/sS1qO8/3 但是正则表达式模块不支持这个。