Python删除任何不是字母或数字的东西

时间:2011-06-12 17:09:48

标签: python regex string

我在使用Python正则表达式时遇到了一些麻烦。

删除字符串中非字母或数字的所有字符有什么好方法?

谢谢!

7 个答案:

答案 0 :(得分:26)

[\w]匹配(字母数字或下划线)。

[\W]匹配(不是(字母数字或下划线)),相当于(不是字母数字而不是下划线)

您需要[\W_]删除所有非字母数字。

当使用re.sub()时,如果通过使用[\W_]+进行匹配而不是一次进行一次替换来减少替换次数(代价高昂)会更有效。

现在您只需要定义字母数字:

str个对象,只有ASCII A-Za-z0-9:

    re.sub(r'[\W_]+', '', s)

str对象,只有语言环境定义的字母数字:

    re.sub(r'[\W_]+', '', s, flags=re.LOCALE)

unicode对象,所有字母数字:

    re.sub(ur'[\W_]+', u'', s, flags=re.UNICODE)

str对象的示例:

>>> import re, locale
>>> sall = ''.join(chr(i) for i in xrange(256))
>>> len(sall)
256
>>> re.sub('[\W_]+', '', sall)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> locale.setlocale(locale.LC_ALL, '')
'English_Australia.1252'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\x83\x8a\x8c\x8e\
x9a\x9c\x9e\x9f\xaa\xb2\xb3\xb5\xb9\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\
xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\
xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
# above output wrapped at column 80

Unicode示例:

>>> re.sub(ur'[\W_]+', u'', u'a_b A_Z \x80\xFF \u0404', flags=re.UNICODE)
u'abAZ\xff\u0404'

答案 1 :(得分:7)

'\W'与您的语言区域中的[^A-Za-z0-9_]加重音字符相同。

>>> re.sub('\W', '', 'text 1, 2, 3...')
'text123'

也许你想要保留空格或拥有所有单词(和数字):

>>> re.findall('\w+', 'my. text, --without-- (punctuation) 123')
['my', 'text', 'without', 'punctuation', '123']

答案 2 :(得分:4)

在字符集匹配规则[...]中,您可以将^指定为第一个字符,表示“不在”

import re
re.sub("[^0-9a-zA-Z]",        # Anything except 0..9, a..z and A..Z
       "",                    # replaced with nothing
       "this is a test!!")    # in this string

--> 'thisisatest'

答案 3 :(得分:3)

您还可以考虑其他方式,例如简单地循环通过字符串并跳过不需要的字符,例如假设您要删除所有不是字母或数字的ascii字符

>>> newstring = [c for c in "a!1#b$2c%3\t\nx" if c in string.letters + string.digits]
>>> "".join(newstring)
'a1b2c3x'

或使用string.translate将一个char映射到另一个char或删除一些chars,例如。

>>> todelete = [ chr(i) for i in range(256) if chr(i) not in string.letters + string.digits ]
>>> todelete = "".join(todelete)
>>> "a!1#b$2c%3\t\nx".translate(None, todelete)
'a1b2c3x'

这样您需要计算一次todelete列表,或者todelete可以进行一次硬编码,并在需要转换字符串的任何地方使用它

答案 4 :(得分:3)

此外,您可以尝试以下方式使用isalpha和isnumeric方法:

text = 'base, sample test;'
getVals = lambda x: (c for c in text if c.isalpha() or c.isnumeric())
map(lambda word: ' '.join(getVals(word)): text.split(' '))

答案 5 :(得分:1)

您可以在python中使用预定义的正则表达式:\W对应于集合[^a-zA-Z0-9_]。然后,

import re
s = 'Hello dutrow 123'
re.sub('\W', '', s)
--> 'Hellodutrow123'

答案 6 :(得分:1)

你需要更具体:

  1. Unicode“字母”怎么样?即那些有变音符号的人。
  2. 白色空间怎么样? (我认为这是你想要删除的标点符号)
  3. 当您说“字母”时,您的意思是{ASCII}只有A-Za-z吗?
  4. 当您说“数字”时,您的意思是0-9吗?小数,分隔符和指数怎么样?
  5. 它很快变得复杂......

    一个好的起点是交互式正则表达式网站,例如RegExr

    您还可以获取特定于Python的Python Regex Tool