在Python中检测非英文字符的字符串

时间:2014-11-23 01:31:48

标签: python regex non-english

我有一些混合了英文和没有英文字母的字符串。例如:

w='_1991_اف_جي2'

如何使用Regex或Python中的任何其他快速方法识别这些类型的字符串?

我不想将字符串中的字母逐个与字母列表进行比较,而是一次性快速地将其完成。

6 个答案:

答案 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)

w.isidentifier()

您可以在docs中轻松查看该方法:

如果根据语言定义,标识符和关键字部分,字符串是有效标识符,则返回true。

答案 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