我在使用Python正则表达式时遇到了一些麻烦。
删除字符串中非字母或数字的所有字符有什么好方法?
谢谢!
答案 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)
你需要更具体:
A-Z
和a-z
吗?0-9
吗?小数,分隔符和指数怎么样?它很快变得复杂......
一个好的起点是交互式正则表达式网站,例如RegExr
您还可以获取特定于Python的Python Regex Tool