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

在这个问题的PHP变体中提出的解决方案可能会进行一些小的调整,但对我来说似乎不太“python化”。

声明一下,我不只是想去掉句号和逗号(以及其他标点符号),还想去掉引号、括号等。


当前回答

正则表达式的拯救:

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

根据Python定义'\W == [^a-zA-Z0-9_],它不包括所有数字、字母和_

其他回答

如果你想保留像áéíóúãẽĩõũ这样的字符,使用这个:

import re
re.sub('[\W\d_]+', '', your_string)

Python 3

使用与@John Machin的答案相同的方法,但针对Python 3进行了更新:

更大的字符集 对翻译工作方式的轻微改变。

现在假定Python代码是用UTF-8编码的 (来源:PEP 3120)

这意味着包含你想要删除的所有字符的字符串会变得更大:

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

翻译方法现在需要使用一个翻译表,我们可以用maketrans()创建:

    
del_map = str.maketrans('', '', del_chars)
    

现在,像以前一样,任何你想要“捏碎”的字符串:

    
scrunched = s.translate(del_map)
    

使用来自@Joe Machin的最后一个计时例子,我们可以看到它仍然比re强一个数量级:

    
> python -mtimeit -s"d=''.join(c for c in map(chr,range(1114111)) if not c.isalnum());m=str.maketrans('','',d);s='foo-'*25" "s.translate(m)"
    
1000000 loops, best of 5: 255 nsec per loop
    
> python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)"
    
50000 loops, best of 5: 4.8 usec per loop
    

正则表达式的拯救:

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

根据Python定义'\W == [^a-zA-Z0-9_],它不包括所有数字、字母和_

如果我理解正确,最简单的方法是使用正则表达式,因为它为您提供了很大的灵活性,但另一个简单的方法是使用循环以下是示例代码,我还计算了单词的出现并存储在字典中。

s = """An... essay is, generally, a piece of writing that gives the author's own 
argument — but the definition is vague, 
overlapping with those of a paper, an article, a pamphlet, and a short story. Essays 
have traditionally been 
sub-classified as formal and informal. Formal essays are characterized by "serious 
purpose, dignity, logical 
organization, length," whereas the informal essay is characterized by "the personal 
element (self-revelation, 
individual tastes and experiences, confidential manner), humor, graceful style, 
rambling structure, unconventionality 
or novelty of theme," etc.[1]"""

d = {}      # creating empty dic      
words = s.split() # spliting string and stroing in list
for word in words:
    new_word = ''
    for c in word:
        if c.isalnum(): # checking if indiviual chr is alphanumeric or not
            new_word = new_word + c
    print(new_word, end=' ')
    # if new_word not in d:
    #     d[new_word] = 1
    # else:
    #     d[new_word] = d[new_word] +1
print(d)

如果这个答案是有用的,请评价这个!

你可以试试:

print ''.join(ch for ch in some_string if ch.isalnum())