2014-11-23 4 views
12

У меня есть строки, в которых есть сочетание английского и никаких английских букв. Например:Обнаружение строк с неанглийскими символами в Python

w='_1991_اف_جي2' 

Как я могу распознать эти типы строк, используя Regex или любой другой быстрый метод в Python?

Я предпочитаю не сравнивать буквы строки один за другим со списком букв, но делать это одним выстрелом и быстро.

+1

возможно использование диапазона ascii с ascii os только английские символы в диапазоне 0-255, я считаю – jgr208

+0

Можете ли вы рассказать мне, как это сделать в Python? – TJ1

+0

@ TJ1 Какую версию Python вы используете? – thefourtheye

ответ

24

Вы можете просто проверить, может ли строка кодироваться только с символами ASCII (которые являются латинским алфавитом + некоторые другие символы). Если он не может быть закодирован, тогда он имеет символы из другого алфавита.

Примечание # -*- coding: ..... Он должен быть там в верхней части файла питона (в противном случае вы получите ошибку о кодировании)

# -*- coding: utf-8 -*- 
def isEnglish(s): 
    try: 
     s.encode(encoding='utf-8').decode('ascii') 
    except UnicodeDecodeError: 
     return False 
    else: 
     return True 

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&') 

Он вернется F, T, F, F, T

+8

Спасибо за ответ. В Python 3, что вы сказали, не работает правильно, купите, я использовал то, что вы предложили, и заменил 's.decode ('ascii')' на 's.encode ('ascii'), а также' UnicodeDecodeError' на 'UnicodeEnecodeError', а затем это сработало. – TJ1

+1

Я действительно использовал Python2 для проверки своего кода. Спасибо за улучшение решения для python3 –

+2

Я отредактировал этот ответ для работы с обоими python 2 и 3. –

5

Если вы работаете со строками (не юникод объектов), вы можете очистить он с переводом и проверить с 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