如何检测一个String中是否有特定的UTF-8字符?(Python)

rqqzpn5f  于 2023-03-24  发布在  Python
关注(0)|答案(5)|浏览(195)

我在python中有一个字符串列表。现在我想从列表中删除所有特殊的UTF-8字符串。我只想要包含从“U+0021”到“U+00 FF”的字符串。那么,你知道一种方法来检测字符串是否只包含这些特殊字符吗?
谢谢:)
编辑:我使用Python 3

nue99wik

nue99wik1#

>>> 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']
ecfdbz9o

ecfdbz9o2#

你所说的“特殊utf-8字符”到底是什么意思?
如果你的意思是每一个非ascii字符,那么你可以尝试:
s.encode('ascii', 'strict')
如果字符串不是100%ascii,则会出现UnicodeDecodeError

k5ifujac

k5ifujac3#

latin 1编码对应于前256个utf8字符。换句话说,如果c是一个Unicode字符,其代码为[0-255],则c.encode('latin1')ord(c)具有相同的值。
因此,要测试一个字符串是否至少有一个字符在[0-255]范围之外,只需尝试将其编码为latin1。如果它不包含任何字符,则编码将成功,否则您将获得UnicodeEncodeError:

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

顺便说一句,正如你在注解中被告知的那样,[0-255]范围之外的Unicode字符不是 * 特殊 *,只是它们不在latin 1范围内。
请注意,上面的代码也接受所有控制字符,如\t\r\n,因为它们是法律的的拉丁字符。它可能是或不是你想要的。

xdyibdwo

xdyibdwo4#

可以使用正则表达式。

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范围内的字符。'[\u0021-\u00FF]'之前的字母r表示原始字符串表示法,它节省了大量反斜杠('')的转义工作。如果没有它,正则表达式中的每个反斜杠都必须以另一个反斜杠作为前缀来转义它。
regexp.search(r'[\u0021-\u00FF]',s)将扫描s,查找正则表达式r'[^\u0021-\u00FF]'产生匹配的第一个位置,并返回相应的匹配对象。如果没有找到匹配,则返回None
filter()将过滤掉不需要的字符串。
这个答案只对Python 3有效

thigvfpy

thigvfpy5#

下面的代码片段对我很有用(在python3中使用Regex):

nonAcceptibleUTF8Chars = list(chr(i) for i in range(161, 255 + 1))
result = re.sub('[' + re.escape(''.join(nonAcceptibleUTF8Chars)) + ']', '', inputString)

输入字符串=维多利亚的秘密
结果=维多利亚秘密
虽然迟到了,希望这对你有帮助!:)

相关问题