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

Chr*_*row 25 python regex string

我对Python正则表达式有点麻烦.

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

谢谢!

Joh*_*hin 31

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

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

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

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

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

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

    re.sub(r'[\W_]+', '', s)
Run Code Online (Sandbox Code Playgroud)

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

    re.sub(r'[\W_]+', '', s, flags=re.LOCALE)
Run Code Online (Sandbox Code Playgroud)

unicode 对象,所有字母数字:

    re.sub(ur'[\W_]+', u'', s, flags=re.UNICODE)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Unicode示例:

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


650*_*502 8

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

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'
Run Code Online (Sandbox Code Playgroud)


JBe*_*rdo 7

'\W'[^A-Za-z0-9_]与您的语言环境中的加号重音字符相同.

>>> re.sub('\W', '', 'text 1, 2, 3...')
'text123'
Run Code Online (Sandbox Code Playgroud)

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

>>> re.findall('\w+', 'my. text, --without-- (punctuation) 123')
['my', 'text', 'without', 'punctuation', '123']
Run Code Online (Sandbox Code Playgroud)