有时候我有一个带有奇怪字符的字符串。它们在浏览器中不可见,但是是字符串的一部分,并以len()计算。 我怎么能摆脱它? Strip()删除正常空格但不删除那些符号。
答案 0 :(得分:12)
使用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
之类的内容。
答案 1 :(得分:4)
您可以使用 str.isprintable()(来自PEP-3138)过滤字符串:
output_str = ''.join(c for c in input_str if c.isprintable())
答案 2 :(得分:3)
收集您要启用的字符集,并删除其他字符
import re
text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)
它将删除除a到z,A到Z和0到9之外的任何字符。
答案 3 :(得分:1)
正则表达式是一种适用于各种字符串分析的优秀且非常通用的工具。如果速度是个问题,那么字符串类中的“translate”方法也可以帮到你。
首先定义一个('identity')映射,它不会改变任何东西:
mapping = map(chr, range(256))
如果您想用“b”替换每个“a”,则修改映射
mapping[ord('a')] = 'b'
现在为“translate”方法构建表:
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))
会忽略所有不需要的字符。