我有一些混合了英文字母和没有英文字母的字符串。例如:
w='_1991_اف_جي2'
如何使用 Regex 或 Python 中的任何其他快速方法识别这些类型的字符串?
我不喜欢将字符串中的字母与字母列表逐个进行比较,而是一次性快速完成。
我有一些混合了英文字母和没有英文字母的字符串。例如:
w='_1991_اف_جي2'
如何使用 Regex 或 Python 中的任何其他快速方法识别这些类型的字符串?
我不喜欢将字符串中的字母与字母列表逐个进行比较,而是一次性快速完成。
您可以检查字符串是否只能使用 ASCII 字符(拉丁字母 + 一些其他字符)进行编码。如果它不能被编码,那么它有来自其他字母的字符。
注意评论# -*- coding: ....
。它应该在 python 文件的顶部(否则你会收到一些关于编码的错误)
# -*- coding: utf-8 -*-
def isEnglish(s):
try:
s.encode(encoding='utf-8').decode('ascii')
except UnicodeDecodeError:
return False
else:
return True
assert not isEnglish('slabiky, ale liší se podle významu')
assert isEnglish('English')
assert not isEnglish('ގެ ފުރަތަމަ ދެ އަކުރު ކަ')
assert not isEnglish('how about this one : 通 asfަ')
assert isEnglish('?fd4))45s&')
恕我直言,这是最简单的解决方案:
def isEnglish(s):
return s.isascii()
print(isEnglish("Test"))
print(isEnglish("_1991_اف_جي2"))
Output:
True
False
如果您使用字符串(不是 unicode 对象),您可以使用翻译清理它并使用 进行检查isalnum()
,这比抛出异常要好:
import string
def isEnglish(s):
return s.translate(None, string.punctuation).isalnum()
print isEnglish('slabiky, ale liší se podle významu')
print isEnglish('English')
print isEnglish('ގެ ފުރަތަމަ ދެ އަކުރު ކަ')
print isEnglish('how about this one : 通 asfަ')
print isEnglish('?fd4))45s&')
print isEnglish('Текст на русском')
> False
> True
> False
> False
> True
> False
您还可以使用此功能从字符串中过滤非 ascii 字符:
ascii = set(string.printable)
def remove_non_ascii(s):
return filter(lambda x: x in ascii, s)
remove_non_ascii('slabiky, ale liší se podle významu')
> slabiky, ale li se podle vznamu
import re
english_check = re.compile(r'[a-z]')
if english_check.match(w):
print "english",w
else:
print "other:",w
我相信这个运行时间会很短,因为它一旦找到一个不是拉丁字母的字符就会停止。它还使用生成器来更好地使用内存。
import string
def has_only_latin_letters(name):
char_set = string.ascii_letters
return all((True if x in char_set else False for x in name))
>>> has_only_latin_letters('_1991_اف_جي2')
False
>>> has_only_latin_letters('bla bla')
True
>>> has_only_latin_letters('blä blä')
False
>>> has_only_latin_letters('저주중앙초등학교')
False
>>> has_only_latin_letters('also a string with numbers and punctuation 1, 2, 4')
True
您还可以使用不同的字符集:
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.digits
'0123456789'
>>> string.digits + string.lowercase
'0123456789abcdefghijklmnopqrstuvwxyz'
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&
\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
要添加拉丁重音字母,您可以参考这篇文章。