我正在使用Python 2.7解析多个XML文件,有一些字符串如:string ="[2,3,13,37–41,43,44,46]"
。我拆分它们以得到所有元素的列表,然后我必须检测带有“ - ”的元素,如“37-41”,但事实证明这不是常规的破折号,它是非ASCII字符:
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
如果在此if表达式中使用非ASCII字符,则会出现错误:"SyntaxError: Non-ASCII character '\xe2' in file..."
。
我尝试用此re方法替换if
表达式:
re.search('\xe2', e)
但事实并非如此。所以我正在寻找一种方法来将非ASCII字符转换为常规ASCII“ - ”或直接在搜索表达式中使用ASCII数。
答案 0 :(得分:3)
您可以检查字符值是否介于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.
答案 1 :(得分: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
>>>
答案 2 :(得分:1)
# -*- 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)
将删除e
中的任何有效ASCII字符(具体来说,用&#34;&#34;替换任何有效的ASCII字符),只保留e的非ASCII字符。
希望这个帮助
答案 3 :(得分:0)
您必须在Python程序中声明编码,例如:
# -*- coding: utf-8 -*-
通常Python会告诉您这个问题:
SyntaxError:第3行文件./fail.py中的非ASCII字符'\ xe2',但未声明编码;有关详细信息,请参阅http://www.python.org/peps/pep-0263.html
添加encoying后,您的代码应该可以正常工作。
答案 4 :(得分:0)
这可能无法解答您的整个问题。方式太简单而且不灵活。每当我遇到这个错误时,我就会这样做。
我通常打开一个交互式python shell ,然后输入:
print [ln for ln in open("filename.py", "rb").readlines() if "\xe2" in ln]
这为你提供了\ ex2的行。然后尝试在编辑器中找到它。并尝试删除该字符。