在Python中从输入中去除右到左标记和其他Unicode字符

0 投票
4 回答
5806 浏览
提问于 2025-04-15 23:23

我正在用Python写一个论坛。我想去掉输入中的一些特殊字符,比如从右到左的标记之类的。有没有什么建议?可能需要用到正则表达式吗?

4 个回答

1
"example".replace(u'\u200e', '')

你可以通过十六进制值来去掉字符,使用 .replace() 方法就可以了。

1

提问者在对另一个回答的评论中,有一个不太容易理解的例子,开头像这样……:

comment = comment.encode('ascii', 'ignore')
comment = '\xc3\xa4\xc3\xb6\xc3\xbc'

当然,如果这两条语句的顺序是这样的,就会出现不同的错误(第一条尝试访问 comment,但只有第二条将这个名字绑定),但我们假设这两行的顺序调换了,如下所示:

comment = '\xc3\xa4\xc3\xb6\xc3\xbc'
comment = comment.encode('ascii', 'ignore')

这样做确实会导致提问者在那个难以理解的评论中提到的错误,原因不同:comment 是一个字节字符串(开头没有 u),而 .encode 是针对unicode 字符串的——所以 Python 首先尝试用默认的编码方式 ascii 将这个字节字符串转换为临时的 unicode 字符串,但这当然会失败,因为这个字符串里全是非 ascii 字符。

在这个字面量前面加上 u 就可以解决这个问题:

comment = u'\xc3\xa4\xc3\xb6\xc3\xbc'
comment = comment.encode('ascii', 'ignore')

(这当然会让 comment 变成空,因为所有的字符都被忽略了)。另外一种情况——比如如果原始的字节字符串来自其他地方,而不是字面量:

comment = '\xc3\xa4\xc3\xb6\xc3\xbc'
comment = comment.decode('latin-1')
comment = comment.encode('ascii', 'ignore')

在这里,第二条语句明确使用一个适合这个例子的编码方式来构建 unicode(这只是个猜测,当然:你不能仅仅通过看到一个裸字节字符串就确定应该用哪个编码!),然后第三条语句再次去掉所有非 ascii 字符(结果 comment 还是空的)。

1

如果你只是想限制字符串中的字符,让它们只能是某种特定的字符集,你可以把这个字符串用那个字符集进行编码,然后忽略编码时出现的错误:

>>> uc = u'aäöüb'
>>> uc.encode('ascii', 'ignore')
'ab'

撰写回答