54

有没有办法使用Pythontr进行字符翻译/音译(有点像命令)?

Perl 中的一些示例是:

my $string = "some fields";
$string =~ tr/dies/eaid/;
print $string;  # domi failed

$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;
print "$string\n";  # b b   b.  (because option "d" is used to delete characters not replaced)
4

6 回答 6

53

string.translate

import string
"abc".translate(string.maketrans("abc", "def")) # => "def"

请注意文档关于 unicode 字符串翻译中的微妙之处的评论。

而对于 Python 3,您可以直接使用:

str.translate(str.maketrans("abc", "def"))

编辑:由于tr有点高级,也考虑使用re.sub.

于 2009-02-17T06:40:10.757 回答
26

如果您使用的是 python3,则翻译不那么冗长:

>>> 'abc'.translate(str.maketrans('ac','xy'))
'xby'

啊..还有等价于tr -d

>>> "abc".translate(str.maketrans('','','b'))
'ac' 

对于tr -dpython2.x 使用附加参数来翻译函数:

>>> "abc".translate(None, 'b')
'ac'
于 2009-09-06T12:17:56.313 回答
5

我开发了python-tr,实现了tr算法。让我们试试看。

安装:

$ pip install python-tr

例子:

>>> from tr import tr
>>> tr('bn', 'cr', 'bunny')
'curry'
>>> tr('n', '', 'bunny', 'd')
'buy'
>>> tr('n', 'u', 'bunny', 'c')
'uunnu'
>>> tr('n', '', 'bunny', 's')
'buny'
>>> tr('bn', '', 'bunny', 'cd')
'bnn'
>>> tr('bn', 'cr', 'bunny', 'cs')
'brnnr'
>>> tr('bn', 'cr', 'bunny', 'ds')
'uy'
于 2015-01-15T13:11:18.147 回答
1

在 Python 2 中,unicode.translate()接受普通映射,即。也不需要导入任何东西:

>>> u'abc+-'.translate({ord('+'): u'-', ord('-'): u'+', ord('b'): None})
u'ac-+'

translate()方法对于交换字符(如上面的“+”和“-”)特别有用,这不能用 来完成replace(),并且re.sub()为此目的使用也不是很简单。

然而,我不得不承认,重复使用ord()不会使代码看起来漂亮整洁。

于 2014-04-18T17:41:42.637 回答
0

我们建立一个地图,然后逐字翻译。当使用 get 作为字典时,第二个参数指定如果找不到任何东西要返回什么。

它可以很容易地转移到单独的功能。大多数情况下应该非常有效。

def transy(strin, old, new):
  assert len(old)==len(new)
  trans = dict(zip(list(old),list(new)))
  res =  "".join([trans.get(i,i) for i in strin])
  return res

>>> transy("abcd", "abc", "xyz")
'xyzd'
于 2020-10-01T12:13:27.727 回答
-5

更简单的方法可能是使用替换。例如

 "abc".replace("abc", "def")
'def'

无需导入任何东西。在 Python 2.x 中工作

于 2013-10-03T18:00:24.673 回答