Python——检查字符串是否包含西里尔字母

21

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

例如:

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

奇怪的是,直到现在这个问题才没有被标记为 [tag:cyrillic]... - smci
4个回答

33

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

您可以使用正規表示式檢查字串中是否包含 а-я, А-Я 範圍內的字符:

import re 

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

或者,您可以匹配整个西里尔字母范围:

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

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


1
糟糕,has_cyrillic('Hello, wёrld!') 的结果是 False - DYZ
2
如果有人在寻找 R 等价物,则 grepl(pattern = '[\u0400-\u04FF]', x = text) 可以解决问题。 - Marina
就我而言,它运行正常。 - Yura Liashenko

11

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='ё'>

4
建议一种比这里讨论的方法更快的方式。 方法#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)

1
要检查一个字符串是否为 Cyrillic,可以使用以下代码:len("экономия3r4".encode("ascii", "ignore")) < len("экономия3r4") - Demetry Pascal
方法一在性能方面很好,但它考虑了所有非ASCII字符(如中文、印地语)而不只是考虑西里尔字母。 - GooDeeJAY

-6
你可以创建一个包含 Cyrillic 字母的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接