【问题标题】:The right way to check if a string has hebrew chars检查字符串是否有希伯来字符的正确方法
【发布时间】:2012-05-19 10:14:27
【问题描述】:

希伯来语在 1424 到 1514(或十六进制 0590 到 05EA)之间具有 unicode 表示。

我正在寻找正确、最有效和最 Pythonic 的方式来实现这一目标。

首先我想出了这个:

for c in s:
    if ord(c) >= 1424 and ord(c) <= 1514:
        return True
return False

然后我带来了一个更优雅的实现:

return any(map(lambda c: (ord(c) >= 1424 and ord(c) <= 1514), s))

也许:

return any([(ord(c) >= 1424 and ord(c) <= 1514) for c in s])

其中哪些是最好的?还是我应该换一种方式?

【问题讨论】:

标签: python ord


【解决方案1】:

你可以这样做:

# Python 3.
return any("\u0590" <= c <= "\u05EA" for c in s)
# Python 2.
return any(u"\u0590" <= c <= u"\u05EA" for c in s)

【讨论】:

    【解决方案2】:

    您的基本选择是:

    1. 匹配包含字符范围的正则表达式;或
    2. 遍历字符串,测试字符在包含所有目标字符的字符串或集合中的成员资格,如果找到匹配项则中断。

    只有实际测试才能显示哪个会更快。

    【讨论】:

    • 两者都比他已经拥有的慢很多,根据定义的范围测试字符肯定比检查约 100 个字符长的字符串成员资格或正则表达式要快
    • @lenik 这是我见过的最弱的回应。我希望你不要把它拉到办公室里。
    • @lenik:事实上,你错了。在我的测试中,正则表达式是最快的。下一个最好的(也是更 Pythonic 的)是反转 Marcin 的建议 2,因此您迭代希伯来字符并测试字符串中的成员资格。号码:gist.github.com/2730521
    • (显然这取决于条件 - 我假设输入中的希伯来字符相对较少,并且程序处理的字符串足够多,可以忽略设置成本)
    • @lenik:我假设程序测试了足够多的字符串,以至于可以忽略创建集合的成本。此外,中文字符不在一个连续范围内,因此您需要对每个字符进行更复杂的范围检查。
    【解决方案3】:

    用unidcodedata检查第一个字符很简单:

    import unicodedata
    
    def is_greek(term):
        return 'GREEK' in unicodedata.name(term.strip()[0])
    
    
    def is_hebrew(term):
        return 'HEBREW' in unicodedata.name(term.strip()[0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2020-07-16
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多