如何检测String中是否包含特定的UTF-8字符? (蟒蛇)

时间:2016-07-11 13:15:59

标签: python python-3.x utf-8

我在python中有一个字符串列表。现在我想删除列表中所有特殊utf-8字符的字符串。我只想要包含" U + 0021"中的字符的字符串。到" U + 00FF"。那么,你知道一种方法来检测String是否只包含这些特殊字符吗?

谢谢:)

编辑:我使用Python 3

4 个答案:

答案 0 :(得分:1)

>>> all_strings = ["okstring", "bađštring", "goodstring"]
>>> acceptible = set(chr(i) for i in range(0x21, 0xFF + 1))
>>> simple_strings = filter(lambda s: set(s).issubset(acceptible), all_strings)
>>> list(simple_strings)
['okstring', 'goodstring']

答案 1 :(得分:0)

您可以使用正则表达式。

import re
mylist = ['str1', 'štr2', 'str3']
regexp = re.compile(r'[^\u0021-\u00FF]')
good_strs = filter(lambda s: not regexp.search(s), mylist)

[^\u0021-\u00FF]定义了一个字符集,这意味着任何一个字符都不在\u0021\u00FF的范围内。 r之前的字母'[\u0021-\u00FF]'表示原始字符串表示法,它为您节省了许多反斜杠('\')的转义作品。没有它,正则表达式中的每个反斜杠都必须以另一个为前缀来逃避它。

regexp.search(r'[\u0021-\u00FF]',s)将浏览s,查找正则表达式r'[^\u0021-\u00FF]'生成匹配项的第一个位置,并返回相应的匹配对象。如果未找到匹配项,则返回None

filter()会过滤掉不需要的字符串。

此答案仅适用于Python 3

答案 2 :(得分:0)

“特殊的utf-8字符”究竟是什么意思?

如果你的意思是每个非ascii字符,那么你可以尝试:

s.encode('ascii', 'strict')

如果字符串不是100%ascii

,它将引发UnicodeDecodeError

答案 3 :(得分:0)

latin1编码对应256个第一个utf8字符。换句话说,如果c是包含[0-255]代码的unicode字符,则c.encode('latin1')ord(c)具有相同的值。

因此,为了测试字符串是否至少有一个字符在[0-255]范围之外,只需尝试将其编码为latin1。如果它不包含,则编码将成功,否则您将获得UnicodeEncodeError:

no_special = True
try:
    s.encode('latin1')
except UnicodeEncodeError:
    no_special = False

BTW,正如你在评论中被告知的那样,[0-255]范围之外的unicode字符不是特殊,只是它们不在latin1范围内。

请注意,上述内容还接受\t\r\n等所有控件字符,因为它们是合法的latin1字符。它可能或不是你想要的。