【问题标题】:Python — check if a string contains Cyrillic charactersPython — 检查字符串是否包含西里尔字符
【发布时间】:2018-01-14 23:34:16
【问题描述】:

如何检查字符串是否包含西里尔字符?

例如

>>> has_cyrillic('Hello, world!')
False
>>> has_cyrillic('Привет, world!')
True

【问题讨论】:

  • 奇怪的是这个问题直到现在才被标记为cyrillic...

标签: python string cyrillic


【解决方案1】:

您可以使用正则表达式来检查字符串是否包含а-я, А-Я 范围内的字符:

import re 

def has_cyrillic(text):
    return bool(re.search('[а-яА-Я]', text))

或者,您可以匹配whole Cyrillic script range

def has_cyrillic(text):
    return bool(re.search('[\u0400-\u04FF]', text))

这也将匹配扩展西里尔字母的字母(例如 ё、Є、ў)。

【讨论】:

  • 糟糕。 has_cyrillic('Hello, wёrld!')False
  • 如果有人正在寻找 R 等效项 grepl(pattern = '[\u0400-\u04FF]', x = text) 将完成这项工作。
【解决方案2】:

regex 支持 Unicode 属性以及一些短格式。

>>> regex.search(r'\p{IsCyrillic}', 'Hello, world!')
>>> regex.search(r'\p{IsCyrillic}', 'Привет, world!')
<regex.Match object; span=(0, 1), match='П'>
>>> regex.search(r'\p{IsCyrillic}', 'Hello, wёrld!')
<regex.Match object; span=(8, 9), match='ё'>

【讨论】:

    【解决方案3】:

    建议一种方法,比这里讨论的更快。

    方法#1:

    len("экономия3r4".encode("ascii", "ignore")) > len ("экономия3r4")
    
    246 ns ± 7.76 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    如果有西里尔字符,则打印“True”

    方法#2:

    Max 在之前的帖子中讨论过

    import re
    
    def has_cyrillic(text):
        return bool(re.search('[а-яА-Я]', text))
    
    has_cyrillic("экономия3r4")
    
    929 ns ± 20.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    【讨论】:

      【解决方案4】:

      您可以创建一个包含西里尔字母的set,然后只检查字符串的每个字符:

      cyrillic_letters = {....} # fill it with the cyrillic letters
      
      def has_cyrillic(text):
          for c in text:
              if c in cyrillic_letters:
                  return True
          return False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 2013-05-18
        • 2013-10-26
        • 1970-01-01
        • 2015-11-12
        相关资源
        最近更新 更多