检查字符串是否只包含ASCII字符?

时间:2016-03-09 10:52:36

标签: python python-2.7

如何检查字符串中是否只包含Python中的ASCII字符?像Ruby的ascii_only?

之类的东西

我希望能够判断从文件中读取的字符串特定数据是否在ascii

4 个答案:

答案 0 :(得分:18)

在Python 3.7中添加了你想要的方法:

  

strbytesbytearray获得了对新isascii()方法的支持,该方法可用于测试字符串或字节是否仅包含ASCII字符。

否则:

>>> all(ord(char) < 128 for char in 'string')
>>> True

>>> all(ord(char) < 128 for char in 'строка')
>>> False

另一个版本:

>>> def is_ascii(text):
    if isinstance(text, unicode):
        try:
            text.encode('ascii')
        except UnicodeEncodeError:
            return False
    else:
        try:
            text.decode('ascii')
        except UnicodeDecodeError:
            return False
    return True
...

>>> is_ascii('text')
>>> True

>>> is_ascii(u'text')
>>> True

>>> is_ascii(u'text-строка')
>>> False

>>> is_ascii('text-строка')
>>> False

>>> is_ascii(u'text-строка'.encode('utf-8'))
>>> False

答案 1 :(得分:4)

您也可以选择正则表达式来检查ascii字符。 [\x00-\x7F]可以匹配单个ascii字符:

>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None
>>> OnlyAscii('string')
True
>>> OnlyAscii('Tannh‰user')
False

答案 2 :(得分:2)

如果您有unicode字符串,则可以使用“encode”函数然后捕获异常:

import chardet

# Get the encoding
enc = chardet.detect(mystring)['encoding']

如果你有字节,你可以导入chardet模块并检查编码:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">


<xs:element name="catalog"/>

<xs:complexType name="textint">
    <xs:sequence>
        <xs:element name="s" type="xs:string"/>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
    </xs:sequence>
</xs:complexType>


<xs:complexType mixed="true" name="inttext">
    <xs:sequence>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
    </xs:sequence>
</xs:complexType>




<xs:element name="Qstr">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="text" type="xs:string"/>
            <xs:element name="a" type="xs:string"/>
            <xs:element name="b" type="xs:string"/>
            <xs:element name="c" type="xs:string"/>
            <xs:element name="d" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>





<xs:element name="Qfl">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="text" type="textint" />
            <xs:element name="a" type="xs:int"/>
            <xs:element name="b" type="xs:float"/>
            <xs:element name="c" type="xs:int"/>
            <xs:element name="d" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>




<xs:element name="Qinttext">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="text" type="xs:inttext"/>
            <xs:element name="a" type="xs:int"/>
            <xs:element name="b" type="xs:int"/>
            <xs:element name="c" type="xs:int"/>
            <xs:element name="d" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>




<xs:element name="Qtextint">
    <xs:complexType mixed="true">
        <xs:sequence>   
            <xs:element name="text" type="xs:textint"/>
            <xs:element name="a" type="xs:textint"/>
            <xs:element name="b" type="xs:int"/>
            <xs:element name="c" type="xs:int"/>
            <xs:element name="d" type="xs:textint"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>



</xs:schema>

答案 3 :(得分:0)

解决问题的方法是尝试使用特定编码对字符串进行编码。

例如:

'H€llø'.encode('utf-8')

这会抛出以下错误:

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)

现在您可以捕获“UnicodeDecodeError”以确定该字符串不仅包含ASCII字符。

try:
    'H€llø'.encode('utf-8')
except UnicodeDecodeError:
    print 'This string contains more than just the ASCII characters.'