我如何检测希伯来语的回文?
我正在为回文求解器编写一系列测试。 我遇到了希伯来语有趣的回文:
טעםלפתתפלמעט
这是一个回文,但Mem这个字母既有常规形式也有“最终形式”(ם),它看起来像是一个单词中的最后一个字母。 但是在我的程序中缺少硬编码,即“0x5de => 0x5dd”,我无法找到一种通过编程方式依靠Unicode,Python或将这两者视为相同的库的方法。 我做过的事情:
s = 'טעם לפת תפל מעט'
s.casefold() # Python 3.4
s.lower()
s.upper()
import unicodedata
unicodedata.normalize(...) # In case this functioned like a German Eszett
所有人都得到了相同的字符串。 其他希伯来语字母会导致这个问题(如果有人在后面搜索这个)将是Kaf,Nun,Peh和Tsadeh。 不,我不是希伯来语的母语。
你可以做一个稍微更“严谨”的答案(一个不太可能给出误报和误报的答案),并做更多的工作。 请注意,Patrick Collin的答案可能会因匹配很多不相关的字符而失败,因为他们在unicode数据名称中共享最后一个单词。
你可以做的一件事是在转换最后的字母时采用更严格的方法:
import unicodedata
# Note the added accents
phrase = 'טעם̀ לפת תפל מ̀עט'
def convert_final_characters(phrase):
for character in phrase:
try:
name = unicodedata.name(character)
except ValueError:
yield character
continue
if "HEBREW" in name and " FINAL" in name:
try:
yield unicodedata.lookup(name.replace(" FINAL", ""))
except KeyError:
# Fails for HEBREW LETTER WIDE FINAL MEM "ﬦ",
# which has no non-final counterpart
#
# No failure if you first normalize to
# HEBREW LETTER FINAL MEM "ם"
yield character
else:
yield character
phrase = "".join(convert_final_characters(phrase))
phrase
#>>> 'טעמ̀ לפת תפל מ̀עט'
这只是寻找希伯来字符,其中“FINAL”可以被删除,并做到这一点。
然后您可以使用PyPI上的“new” regex
模块将其转换为字形。
import regex
# "X" matches graphemes
graphemes = regex.findall("X", phrase)
graphemes
#>>> ['ט', 'ע', 'מ̀', ' ', 'ל', 'פ', 'ת', ' ', 'ת', 'פ', 'ל', ' ', 'מ̀', 'ע', 'ט']
graphemes == graphemes[::-1]
#>>> True
这涉及口音和其他组合字符。
这是一个很糟糕的解决方案,适用于您当前的问题:
import unicodedata
def make_map(ss):
return [unicodedata.name(s).split(' ')[-1] for s in ss]
def is_palindrome(ss):
return make_map(ss) == make_map(reversed(ss))
尽管如此,这依赖于Python查找表中希伯来字符名称的格式,所以它可能无法完全概括。
具体来说,你有:
In [29]: unicodedata.name(s[2])
Out[29]: 'HEBREW LETTER FINAL MEM'
...
In [31]: unicodedata.name(s[-3])
Out[31]: 'HEBREW LETTER MEM'
所以,除了最后一个字之外的所有东西都会剥离出来:
In [35]: [unicodedata.name(s_).split(" ")[-1] for s_ in s]
Out[35]: ['TET', 'AYIN', 'MEM', 'SPACE', 'LAMED', 'PE', 'TAV', 'SPACE', 'TAV', 'PE', 'LAMED', 'SPACE', 'MEM', 'AYIN', 'TET']
与此相反。 不过,Unicode是一个很大的世界,所以我不确定你是否不能构建一个能够胜过这个的例子。
链接地址: http://www.djcxy.com/p/21159.html