【问题标题】:How to detect if a String has specific UTF-8 characters in it? (Python)如何检测字符串中是否包含特定的 UTF-8 字符? (Python)
【发布时间】:2016-07-11 13:15:58
【问题描述】:

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

谢谢:)

编辑:我使用 Python 3

【问题讨论】:

  • 哪个 Python,2 还是 3?
  • U+00FF 以上的字符不是“特殊的”;你只是不想要它们,这完全是任意的。
  • @deceze 即使它们并不特别,我也不想要它们,对吧:)
  • @frnhr 我使用 Python 3 :)

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


【解决方案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']

【讨论】:

  • 我认为这是更好的答案,因为问题标题是“如何检测字符串中是否包含特定的 UTF-8 字符?(Python)”这个答案通常允许您检查任何一组 unicode 字符,而接受的答案仅检查非 ASCII 样式字符。
【解决方案2】:

latin1 编码对应前 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 字符不是 特殊,只是它们不在 latin1 范围内。

请注意,上面还接受所有控制字符,例如 \t、\r 或 \n,因为它们是合法的 latin1 字符。它可能是也可能不是你想要的。

【讨论】:

  • 这个答案显然只对 Python3 有效。仅当 s 是 unicode 字符串时,它对 Python2 才有意义。
【解决方案3】:

“特殊 utf-8 字符”到底是什么意思?

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

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

如果字符串不是 100% ascii,则会引发 UnicodeDecodeError

【讨论】:

  • @BlaBlaBlabli 我的意思是“具体”而不是特殊。特定字符是不是“U+0021”到“U+00FF”的每个字符。所以如果我在我的字符串中找到一个字符之外的字符,我想对字符串做一些事情,比如从 lsit 中删除它。
  • @SergeBallesta ups,我的意思是编码,我已经编辑了我的答案。
【解决方案4】:

你可以使用正则表达式。

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 有效

【讨论】:

  • 我不想替换字符串中的字符。我只想知道我的 utf-8 字符集之外是否有任何字符。你有一个像 if (re.find(r'[\u0021-\u00ff]',s)) 的例子(我不知道,我真的不熟悉它的一切
  • @tommitomtom 试试re.search。
  • @syntonym 现在它像所有东西一样匹配。我在 if 决定中尝试了一些字符。我和每个角色都匹配
  • @tommitomtom 我误解了你的问题。将再次编辑它。
  • @ltux 我已经找到了解决方案。非常感谢您的所有帮助:)
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多