使用 Python 进行字符翻译(如 tr 命令)

发布于 2024-07-13 22:26:08 字数 476 浏览 15 评论 0原文

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

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)

Is there a way to do character translation / transliteration (kind of like the tr command) using Python?

Some examples in Perl would be:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

霓裳挽歌倾城醉 2024-07-20 22:26:08

请参阅 string.translate

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

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

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

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

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

See string.translate

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

Note the doc's comments about subtleties in the translation of unicode strings.

And for Python 3, you can use directly:

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

Edit: Since tr is a bit more advanced, also consider using re.sub.

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

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

啊..并且还有相当于 tr -d

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

对于带有 python2.x 的 tr -d 使用附加参数翻译功能:

>>> "abc".translate(None, 'b')
'ac'

If you're using python3 translate is less verbose:

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

Ahh.. and there is also equivalent to tr -d:

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

For tr -d with python2.x use an additional argument to translate function:

>>> "abc".translate(None, 'b')
'ac'
海未深 2024-07-20 22:26:08

我开发了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'

I has developed python-tr, implemented tr algorithm.
Let's try it.

Install:

$ pip install python-tr

Example:

>>> 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'
人海汹涌 2024-07-20 22:26:08

在 Python 2 中,unicode.translate() 接受普通映射,即。 也无需导入任何内容:

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

translate() 方法对于交换字符(如上面的“+”和“-”)特别有用,而 replace( 无法做到这一点) ),并且使用 re.sub() 也不是很简单。

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

In Python 2, unicode.translate() accepts ordinary mappings, ie. there's no need to import anything either:

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

The translate() method is especially useful for swapping characters (as '+' and '-' above), which can't be done with replace(), and using re.sub() isn't very straightforward for that purpose either.

I have to admit, however, that the repeated use of ord() doesn't make the code look like nice and tidy.

自演自醉 2024-07-20 22:26:08

我们绘制地图,然后逐字翻译。 当对字典使用 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'

We build a map and then translate letter by letter. When using get for dictionary then the second argument specifying what to return if not find anything.

It could be easily transferred to separate function. Mostly should be very efficient.

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'
红颜悴 2024-07-20 22:26:08

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

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

不需要导入任何东西。 适用于 Python 2.x

A simpler approach may be to use replace. e.g.

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

No need to import anything. Works in Python 2.x

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文