python正则表达式:如何只过滤特殊字符?

时间:2013-11-21 01:20:54

标签: python regex

我想检查给定的单词是否包含特殊字符。
所以下面是我的python代码

文字'a @ bcd'有'@',所以它会匹配,没关系。
但'a1bcd'没有特殊的性格。但它也被过滤了!

import re
regexp = re.compile('[~`!@#$%^&*()-_=+\[\]{}\\|;:\'\",.<>/?]+')

if regexp.search('a@bcd') :
    print 'matched!! nich catch!!'

if regexp.search('a1bcd') :
    print 'something is wrong here!!!'

结果: python ../special_char.py 匹配! nich抓住!! 这里有些不对劲!!!

我不知道为什么它像上面那样工作..有人帮助我...... T_T ;;; 感谢〜

2 个答案:

答案 0 :(得分:1)

将正则表达式中的短划线移动到[]组的开头,如下所示:

regexp = re.compile('[-~`!@#$%^&*()_=+\[\]{}\\|;:\'\",.<>/?]+')

如果您使用短划线,则会将其与周围的字符)-_一起阅读,因为它位于[]内,所以它被解释为要求匹配从)到{{的范围1}}。如果您将短划线移动到_之后,它没有特殊含义,而是匹配自己。

这是一个交互式会话,显示正则表达式中的特定问题:

[

修好后:

>>> import re
>>> print re.search('[)-_]', 'abcd')
None
>>> print re.search('[)-_]', 'a1b')
<_sre.SRE_Match object at 0x7f71082247e8>
>>> print re.search('[)-_]', 'a1b').group(0)
1

除非您的问题中没有显示某些原因,否则我也会说不需要最后的>>> print re.search('[-)_]', 'a1b') None

答案 1 :(得分:1)

re对于此

来说会相对较慢

我建议尝试

specialchars = '''-~`!@#$%^&*()_=+[]{}\\|;:'",.<>/?'''
len(word) != len(word.translate(None, specialchars))

set(word) & set(specialchars)