如何将迭代str.replace()转换为str.translate()?-python

如何将迭代str.replace()转换为str.translate()?-python,python,string,replace,translate,punctuation,Python,String,Replace,Translate,Punctuation,我任务的目的是在标点符号前后添加空格。目前,我一直在使用迭代的str.replace()将每个标点符号p替换为“+p+”如何使用str.translate()实现相同的输出,在这里我只需输入两个列表或一个字典即可: inlist = string.punctuation outlist = [" "+p+" " for p in string.punctuation] inoutdict = {p:" "+p+" " for p in string.punctuation} 假设我所有的标点符

我任务的目的是在标点符号前后添加空格。目前,我一直在使用迭代的
str.replace()
将每个标点符号
p
替换为
“+p+”
如何使用
str.translate()
实现相同的输出,在这里我只需输入两个列表或一个字典即可

inlist = string.punctuation
outlist = [" "+p+" " for p in string.punctuation]
inoutdict = {p:" "+p+" " for p in string.punctuation}
假设我所有的标点符号都在
字符串中。标点符号
。目前,我正在这样做:

from string import punctuation as punct
def punct_tokenize(text):
  for ch in text:
    if ch in deupunct:
      text = text.replace(ch, " "+ch+" ")
  return " ".join(text.split())

sent = "This's a foo-bar sentences with many, many punctuation."
print punct_tokenize(sent)

这个迭代的
str.replace()
花费的时间太长,
str.translate()
会更快吗?

dict形式的translate只适用于Unicode:

>>> import string
>>> inoutdict = {ord(p):unicode(" "+p+" ") for p in string.punctuation}
>>> unicode("foo,,,bar!!1").translate(inoutdict)
u'foo ,  ,  , bar !  ! 1'
另一个选项是使用正则表达式:

>>> import re
>>> rx = '[%s]' % re.escape(string.punctuation)
>>> re.sub(rx, r" \g<0> ", "foo,,,bar!!1")
'foo ,  ,  , bar !  ! 1'
>>重新导入
>>>rx='[%s]'%re.escape(字符串.标点符号)
>>>关于sub(rx,r“\g”,“foo,,,bar!!1”)
“foo,,,bar!1'

像往常一样,向我们展示一幅更大的图景以获得更好的答案,例如,你为什么要这样做?输入来自何处?等等。

什么是
\g
意思?@alvas:引用“零组”(即找到的整个子字符串)是一种奇特(但唯一)的方法。感谢这两种解决方案,translate和regex解决了在句子标点符号前后添加空格的问题。我使用了
“”.join(spaced\u punct\u text.split())
来解析多个空格输出=)这两种解决方案都比迭代的
str.replace()快得多