如何翻译以下字符串
H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c}
进入
H. P. Dembinski, B. K\xe9gl, I. C. Mari\u015f, M. Roth, D. Veberi\u010d
答案 0 :(得分:4)
此代码应该处理示例中的模式。它现在足以添加rest of those codes。把它们放在桌子上。
#!/usr/bin/python3
import re, unicodedata, sys
table = {
'v': '\u030C',
'c': '\u0327',
"'": '\u0301'
# etc...
}
def despecial(s):
return re.sub(r"\\(" + '|'.join(map(re.escape, table)) + r")\{(\w+)}",
lambda m: m.group(2) + table[m.group(1)],
s)
if __name__ == '__main__':
print(unicodedata.normalize('NFC', despecial(' '.join(sys.argv[1:]))))
示例:
>>> despecial(r"H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c}")
'H.P. Dembinski, B. Kégl, I.C. Mariş, M. Roth, D. Veberič'
示例(命令行):
$ ./path/to/script.py "Hello W\v{o}rld"
Hello Wǒrld
它在给定的参数之后放置适当的Unicode组合字符。具体来说:U + 0301组合ACUTE ACCENT,U + 0327组合CEDILLA和U + 030C组合CARON。如果你想要组成的字符串,你可以用unicodedata.normalize
或其他东西标准化它。
>>> import unicodedata
>>> unicodedata.normalize('NFC', despecial(r"H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c}"))
'H.P. Dembinski, B. Kégl, I.C. Mariş, M. Roth, D. Veberič'
那就是说,我确定有更好的办法来解决这个问题。看起来你拥有的是LaTeX代码。
答案 1 :(得分:1)
>>> s = "H.P. Dembinski, B. K\\'{e}gl, I.C. Mari\\c{s}, M. Roth, D. Veberi\\v{c}"
>>> s.replace(u"\\'{e}", u"\xe9").replace(u"\\c{s}", u"\u015f").replace(u"\\v{c}", u"\u010d")
u'H.P. Dembinski, B. K\xe9gl, I.C. Mari\u015f, M. Roth, D. Veberi\u010d'
那当然是蛮力方法。正如你所说,你将有许多可能的替代品,这是另一种仍然蛮力但更清洁的方式:
>>> table = ((u"\\'{e}", u"\xe9"), (u"\\c{s}", u"\u015f"), (u"\\v{c}", u"\u010d"))
>>> new = s
>>> for pattern, ch in table:
new = new.replace(pattern, ch)
>>> new
u'H.P. Dembinski, B. K\xe9gl, I.C. Mari\u015f, M. Roth, D. Veberi\u010d'
由于替换字符串的常见模式,您还可以利用正则表达式。
>>> import re
>>> split = re.split(u"(\\\\['a-z]{[a-z]})", s)
>>> table = {u"\\'{e}": u"\xe9", u"\\c{s}": u"\u015f", u"\\v{c}": u"\u010d"}
>>> ''.join(table[piece] if piece in table else piece for piece in split)
u'H.P. Dembinski, B. K\xe9gl, I.C. Mari\u015f, M. Roth, D. Veberi\u010d'