繁体   English   中英

如何在Python中检测非ASCII字符?

[英]How to detect non-ASCII character in Python?

我正在使用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-127之间。

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

试试看:

>>> 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
>>> 
# -*- 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字符被保留。

希望这个帮助

您必须在Python程序中声明编码,例如:

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

通常,Python会告诉您有关此问题的信息:

SyntaxError:第3行的文件./fail.py中的非ASCII字符'\\ xe2',但未声明编码; 有关详细信息,请参见http://www.python.org/peps/pep-0263.html

添加encoying后,您的代码应该可以正常工作。

这可能无法回答您的整个问题。 方式太简单而不灵活。 每当遇到此错误时,我都会这样做。

我通常打开一个交互式python shell,然后输入:

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

这样就可以使用\\ ex2行。 然后尝试在编辑器中找到它并尝试删除该字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM