【发布时间】:2012-02-10 02:07:01
【问题描述】:
我正在使用 Python v2.6,并且我有一个字符串,其中包含许多我想去掉的标点符号。现在我已经研究过使用string.punctuation() 函数,但不幸的是,我想去掉除句号和破折号之外的所有标点符号。总共只有 5 个标点符号我想去掉 - ()\"'
有什么建议吗?我希望这是最有效的方法。
谢谢
【问题讨论】:
我正在使用 Python v2.6,并且我有一个字符串,其中包含许多我想去掉的标点符号。现在我已经研究过使用string.punctuation() 函数,但不幸的是,我想去掉除句号和破折号之外的所有标点符号。总共只有 5 个标点符号我想去掉 - ()\"'
有什么建议吗?我希望这是最有效的方法。
谢谢
【问题讨论】:
您可以使用str.translate(table[, deletechars]) 并将table 设置为None,这将导致deletechars 中的所有字符都从字符串中删除:
s.translate(None, r"()\"'")
一些例子:
>>> "\"hello\" '(world)'".translate(None, r"()\"'")
'hello world'
>>> "a'b c\"d e(f g)h i\\j".translate(None, r"()\"'")
'ab cd ef gh ij'
【讨论】:
你可以列出所有你不想要的字符:
unwanted = ['(', ')', '\\', '"', '\'']
然后你可以像这样创建一个函数strip_punctuation(s):
def strip_punctuation(s):
for u in unwanted:
s = s.replace(u, '')
return s
【讨论】:
>>> import re
>>> r = re.compile("[\(\)\\\\'\"]")
>>> r.sub("", "\"hello\" '(world)'\\\\\\")
'hello world'
【讨论】:
r.sub('', 'a\\b') --> 'a\\b'
r"C:\Program Files\SomeCompany\SomeProgram Version 7\Internals\foobar.bla" 显然比替代方案好得多,但很多时候我也需要 "\t\n\0\xad\xde\xef\xbe"...
s = ''' abc(de)f\gh"i' '''
print(s.translate(None, r"()\"'"))
# abcdefghi
或re.sub:
import re
re.sub(r"[\\()'\"]",'',s)
但string.translate 似乎要快一个数量级:
In [148]: %timeit (s*1000).translate(None, r"()\"'")
10000 loops, best of 3: 112 us per loop
In [146]: %timeit re.sub(r"[\\()'\"]",'',s*1000)
100 loops, best of 3: 2.11 ms per loop
【讨论】:
None。
"。
translate(None,...) 的更正。哪里格式不对?我已经运行了代码。它似乎有效。
print 显示为红色。看起来 SO 没有正确解析三引号。也许你需要提示一下代码 sn-p 是 Python?我不知道。
您可以创建一个包含所有要替换的字符的字典,并用您选择的字符替换它们。
char_replace = {"'":"" , "(":"" , ")":"" , "\":"" , """:""}
for i,j in char_replace.iteritems():
string = string.replace(i,j)
【讨论】:
my_string = r'''\(""Hello ''W\orld)'''
strip_chars = r'''()\'"'''
使用理解:
''.join(x for x in my_string if x not in strip_chars)
使用过滤器:
''.join(filter(lambda x: x not in strip_chars, my_string))
输出:
Hello World
【讨论】: