【发布时间】:2018-01-14 23:34:16
【问题描述】:
如何检查字符串是否包含西里尔字符?
例如
>>> has_cyrillic('Hello, world!')
False
>>> has_cyrillic('Привет, world!')
True
【问题讨论】:
-
奇怪的是这个问题直到现在才被标记为cyrillic...
如何检查字符串是否包含西里尔字符?
例如
>>> has_cyrillic('Hello, world!')
False
>>> has_cyrillic('Привет, world!')
True
【问题讨论】:
您可以使用正则表达式来检查字符串是否包含а-я, А-Я 范围内的字符:
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。
grepl(pattern = '[\u0400-\u04FF]', x = text) 将完成这项工作。
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='ё'>
【讨论】:
建议一种方法,比这里讨论的更快。
方法#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)
【讨论】:
您可以创建一个包含西里尔字母的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
【讨论】: