【问题标题】:Python - how to delete hidden signs from string?Python - 如何从字符串中删除隐藏的符号?
【发布时间】:2011-11-01 02:55:27
【问题描述】:

有时我有一个带有奇怪字符的字符串。它们在浏览器中不可见,但它们是字符串的一部分并计入 len()。 我怎样才能摆脱它? Strip() 删除正常空间,但不删除符号。

【问题讨论】:

标签: python


【解决方案1】:

您可以使用 str.isprintable() 过滤您的字符串(来自PEP-3138):

output_str = ''.join(c for c in input_str if c.isprintable())

【讨论】:

  • 即使在几年后的现在也很容易实现。如果你想在字符串中收集那些不可见的元素,那么,你只需:[c for c in _x if not c.isprintable()]。就我而言,我只得到不可见的,所以,你可以做一些“热代码”,做任何你想做的事情。
【解决方案2】:

正则表达式是用于各种字符串分析的良好且非常通用的工具。如果速度是个问题,字符串类中的“翻译”方法也可以为您提供帮助。

首先你定义一个('identity')映射,它不会改变任何东西:

mapping = map(chr, range(256))

如果你想用一个“b”替换每个“a”,你修改你的映射

mapping[ord('a')] = 'b'

现在您为“翻译”方法构建表:

table = "".join(mapping)

print "abc".translate(table)

打印“bbc”。

如果你真的要删除“a”,你不修改上面的映射,建表然后调用 翻译如下:

print "abc".translate(table, "a")

给你“bc”。

一旦建表,translate方法非常快。

因此,在您的情况下,您可以修改映射,以便将所有不需要的字符映射到空格

mapping = map(chr, range(256))
table = "".join( " " if c in unwanted_chars else c for c in map(chr, range(256)) )

并使用len("my string".translate(table).trim()) 忽略不需要的字符 在字符串的开头和结尾。

或者你使用len("my string".translate(table, unwanted_chars)),它会忽略所有你不需要的字符。

【讨论】:

  • 不错。明天我再次投票时+1。我想过翻译,但懒得查语法。
【解决方案3】:

使用string 模块中的字符类别。如果你想允许所有可打印的字符,你可以这样做

from string import printable
new_string = ''.join(char for char in the_string if char in printable)

根据您的回答,您也可以使用 re.sub 执行此操作:

new_string = re.sub("[^{}]+".format(printable), "", the_string)

另外,如果你想查看字符串中的所有字符,即使是不可打印的字符,你也可以这样做

print repr(the_string)

对于不可打印的字符,它将显示诸如 \x00 之类的内容。

【讨论】:

    【解决方案4】:

    收集您想要启用的字符集并像这样删除其余字符

    import re
    text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)

    它将删除除 a 到 z、A 到 Z 和 0 到 9 以外的任何字符。

    【讨论】:

    • 我需要完整的 utf8 符号集:/
    • @robos85,您需要一些信息才能剥离或不剥离。那么我可以假设您需要为 utf8 去除所有无效字符吗?有一个解决方案,但可能包含不可见/不可打印的字符。
    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 2020-05-04
    • 2016-05-04
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多