2016-05-02 2 views
0

Я разбираю несколько файлов XML с помощью Python 2.7, есть несколько строк: string ="[2,3,13,37–41,43,44,46]". Я разделил их, чтобы получить список всех элементов, а затем я должен обнаружить элементы с «-» как «37-41», но оказывается, что это не обычный тире, это не-ASCII-символ:Как обнаружить символ не ASCII в Python?

elements = [u'2', u'3', u'13', u'37\u201341', u'43', u'44', u'46'] 

Так что мне нужно что-то вроде

for e in elements: 
    if "–" in e: 
     # do something about it 

Если использование, что не-ASCII символ в этом случае выражение, то я получаю сообщение об ошибке: "SyntaxError: Non-ASCII character '\xe2' in file...".

Я попытался заменить выражение if этим методом Re:

re.search('\xe2', e) 

, но это не тот случай снова. Поэтому я ищу способ конвертировать этот символ без ASCII в обычный ASCII «-» или использовать номер ASCII непосредственно в выражении поиска.

+0

Элементы, содержащие только штрихи и цифры не-ascii? – EbraHim

+0

@EbraHim да. Я хочу обнаружить такие элементы, как 37-41, поэтому я могу расширить их, чтобы они были похожими на 37 38 39 40 41. Я могу сделать вторую часть легко, но у меня проблема с символом не-ascii. – sheshkovsky

+1

Python 2 или Python 3? ASCII-символы (0-127), или вы включаете ISO Latin 1 (0-255)? – cdarke

ответ

0
# -*- coding: utf-8 -*- 

import re 

elements = [u'2', u'3', u'13', u'37\u201341', u'43', u'44', u'46'] 

for e in elements: 
    if (re.sub('[ -~]', '', e)) != "": 
     #do something here 
     print "-" 

re.sub('[ -~]', '', e) лишит любые допустимые символы ASCII в e (В частности, заменить любые допустимые символы ASCII с «»), которые остались только не-ASCII символов е.

Надежда эта помощь

+0

он работал очень хорошо. просто нужно было изменить последний отпечаток на 'print e', и он напечатал именно тот элемент, который я искал. Я был бы признателен, если вы можете дать мне ссылку на документацию, потому что синтаксис немного странный. – sheshkovsky

+0

Я думаю, что этот код на самом деле довольно неясен - есть ли кто-нибудь, кто видит, что 'if (re.sub ('[- ~]', '', e))! =" "' Делает сразу? –

+1

определение 're.sub': https://docs.python.org/2.7/library/re.html#re.sub – luiyezheng

1

Дайте это попробовать:

>>> import re 
>>> non_decimal = re.compile(r'[^\d.]+') 
>>> 
>>> string ="[2,3,13,37–41,43,44,46]" 
>>> new_str = string.replace("[","") 
>>> new_str = new_str.replace("]","") 
>>> lst = new_str.split(",") 
>>> for element in lst: 
    if element.isdigit(): 
     print element 
    else: 
     toexpand = non_decimal.sub('f', str(element)) 
     toexpand = toexpand.split("f") 
     for i in range(int(toexpand[0]),int(toexpand[1])+1,1): 
      print i 


2 
3 
13 
37 
38 
39 
40 
41 
43 
44 
46 
>>> 
+0

Я хочу обнаружить элемент, содержащий не-ascii тире, например 37-41. не игнорируйте его. – sheshkovsky

+0

@AliGH Проверьте наличие обновленного ответа. – EbraHim

+0

Я все еще получаю UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0x96 в позиции 0: порядковый номер не в диапазоне (128). Я использую PyCharm IDE, возможно, это вызвало проблему? – sheshkovsky

0

Вы должны объявить кодировку в программе Python, например:

# -*- coding: utf-8 -*- 

Обычно Python говорит вам об этой проблеме:

SyntaxError: Non-ASCII character '\xe2' in file ./fail.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

После добавления привязки ваш код должен работать нормально.

+1

это не сработало для меня, я использую PyCharm IDE, и я все еще получаю UnicodeDecodeError: UnicodeDecodeError: кодек ascii не может декодировать байт 0xe2 в позиции 0: порядковый номер не в диапазоне (128) – sheshkovsky

1

Вы можете проверить, если значение символа находится между 0 - 127.

for c in someString: 
    if 0 <= ord(c) <= 127: 
     # this is a ascii character. 
    else: 
     # this is a non-ascii character. Do something. 
0

Это не может ответить на весь ваш вопрос. Путь слишком простой и негибкий. Я делаю это всякий раз, когда у меня есть эта ошибка.

Я обычно открываю в интерактивных оболочки Python и я печатаю:

print [ln for ln in open("filename.py", "rb").readlines() if "\xe2" in ln]

Это дает вам линию с \ EX2. Затем попробуйте найти его в своем редакторе и попробуйте удалить символ.

Смежные вопросы