50

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

w='_1991_اف_جي2'

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

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

4

6 回答 6

95

您可以检查字符串是否只能使用 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&')
于 2014-11-23T01:45:31.807 回答
26

恕我直言,这是最简单的解决方案:

def isEnglish(s):
  return s.isascii()

print(isEnglish("Test"))
print(isEnglish("_1991_اف_جي2"))

Output:
True
False
于 2019-12-18T11:32:40.887 回答
17

如果您使用字符串(不是 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
于 2016-09-30T13:49:48.167 回答
4
import re

english_check = re.compile(r'[a-z]')

if english_check.match(w):
    print "english",w
else:
    print "other:",w
于 2018-05-16T07:08:29.647 回答
3

我相信这个运行时间会很短,因为它一旦找到一个不是拉丁字母的字符就会停止。它还使用生成器来更好地使用内存。

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'

要添加拉丁重音字母,您可以参考这篇文章

于 2019-09-19T09:59:56.100 回答
0
w.isidentifier()

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

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

于 2019-07-16T12:33:42.650 回答