我有一些混合了英文和没有英文字母的字符串。例如:
w='_1991_اف_جي2'
如何使用Regex或Python中的任何其他快速方法识别这些类型的字符串?
我不想将字符串中的字母逐个与字母列表进行比较,而是一次性快速地将其完成。
答案 0 :(得分:46)
您可以检查字符串是否只能用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&')
答案 1 :(得分:10)
如果您使用字符串(而不是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
答案 2 :(得分:2)
import re
english_check = re.compile(r'[a-z]')
if english_check.match(w):
print "english",w
else:
print "other:",w
答案 3 :(得分:0)
答案 4 :(得分:0)
我相信这会减少运行时间,因为一旦找到了既不是拉丁字母的字符,它就会停止运行。它还使用生成器来更好地利用内存。
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'
要添加带有拉丁字母的字母,可以参考this post。
答案 5 :(得分:0)
恕我直言,这是最简单的解决方案:
def isEnglish(s):
return s.isascii()
print(isEnglish("Test"))
print(isEnglish("_1991_اف_جي2"))
Output:
True
False