在Python中从字符串中除去字母数字字符以外的所有内容

2024-04-19 19:03:27 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python从字符串中去除所有非字母数字字符的最佳方法是什么?

PHP variant of this question中给出的解决方案可能会进行一些小的调整,但在我看来并不是很“Python”。

为了记录在案,我不仅想去掉句点和逗号(以及其他标点符号),还想去掉引号、括号等


Tags: of方法字符串字母数字解决方案this字符
3条回答

我只是出于好奇才给一些功能计时。在这些测试中,我将从字符串string.printable(内置string模块的一部分)中删除非字母数字字符。使用编译的'[\W_]+'pattern.sub('', str)被发现是最快的。

$ python -m timeit -s \
     "import string" \
     "''.join(ch for ch in string.printable if ch.isalnum())" 
10000 loops, best of 3: 57.6 usec per loop

$ python -m timeit -s \
    "import string" \
    "filter(str.isalnum, string.printable)"                 
10000 loops, best of 3: 37.9 usec per loop

$ python -m timeit -s \
    "import re, string" \
    "re.sub('[\W_]', '', string.printable)"
10000 loops, best of 3: 27.5 usec per loop

$ python -m timeit -s \
    "import re, string" \
    "re.sub('[\W_]+', '', string.printable)"                
100000 loops, best of 3: 15 usec per loop

$ python -m timeit -s \
    "import re, string; pattern = re.compile('[\W_]+')" \
    "pattern.sub('', string.printable)" 
100000 loops, best of 3: 11.2 usec per loop

使用str.translate()方法。

假设你经常这样做:

(1)创建一个包含要删除的所有字符的字符串:

delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())

(2)每当你想拧一串:

scrunched = s.translate(None, delchars)

安装成本可能比重新编译更有利;边际成本要低得多:

C:\junk>\python26\python -mtimeit -s"import string;d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)"
100000 loops, best of 3: 2.04 usec per loop

C:\junk>\python26\python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r'[\W_]+')" "r.sub('',s)"
100000 loops, best of 3: 7.34 usec per loop

注意:使用string.printable作为基准数据会给模式“[\W\uu]+”带来不公平的优势;所有非字母数字字符都在一组中。。。在典型的数据中,需要进行多个替换:

C:\junk>\python26\python -c "import string; s = string.printable; print len(s),repr(s)"
100 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

如果给re.sub更多的工作要做,会发生以下情况:

C:\junk>\python26\python -mtimeit -s"d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s='foo-'*25" "s.translate(None,d)"
1000000 loops, best of 3: 1.97 usec per loop

C:\junk>\python26\python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)"
10000 loops, best of 3: 26.4 usec per loop

正则表达式:

import re
re.sub(r'\W+', '', your_string)

By Python definition '\W == [^a-zA-Z0-9_], which excludes all numbers, letters and _

相关问题 更多 >