如何检查字符串中是否只包含Python中的ASCII字符?像Ruby的ascii_only?
我希望能够判断从文件中读取的字符串特定数据是否在ascii
中答案 0 :(得分:18)
在Python 3.7中添加了你想要的方法:
str
,bytes
和bytearray
获得了对新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.'