从python中的长字符串中删除某些字符

时间:2012-06-09 19:52:08

标签: python string

我正在开发一个项目,该项目涉及获取一些源代码并将其归结为页面上显示的单词。我可以让它删除所有的html标签,以及脚本标签之间的所有东西,但我无法弄清楚如何删除所有以反斜杠开头的字符。页面将包含\ t,\ n和\ x **,其中*似乎是任何小写字母或数字。

我如何编写用空格替换字符串的所有这些部分的代码?我在python工作。

例如,这是来自网页的字符串:

\n\t\n\t\n\t\tApple - Wikipedia, the free encyclopedia\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\n\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\tLanguage:English\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9Aragon\xc3\xa9sAsturianuAz\xc9\x99rbaycanca\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbeB\xc3\xa2n-l\xc3\xa2m-g\xc3\xbaBasa Banyumasan\xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0

会变成:

Apple - Wikipedia, the free encyclopedia Language:English sAsturianuAz rbaycanca Basa Banyumasan

5 个答案:

答案 0 :(得分:1)

s = repr('''\n\t\n\t\n\t\tApple - Wikipedia, the free encyclopedia\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\n\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\tLanguage:English\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9Aragon\xc3\xa9sAsturianuAz\xc9\x99rbaycanca\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbeB\xc3\xa2n-l\xc3\xa2m-g\xc3\xbaBasa Banyumasan\xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0''')
s =  re.sub(r'\\[tn]', '', s)
s =  re.sub(r'\\x..', '', s)
print s

答案 1 :(得分:0)

写一个regex以匹配所有需要的模式,然后用空格替换它们。

答案 2 :(得分:0)

鉴于纯文本字至少包含三个字符:

' '.join(re.findall(r'\w{3,}', s)) # where s represents the string

或者:

' '.join(re.findall(r'(?:\w{3,}|-(?=\s))', s)) # in order to preserve the dash char

答案 3 :(得分:0)

Wikipedia使用UTF-8字符串编码。要转换为纯ASCII,您必须

  1. 从UTF-8转换为unicode
  2. 从unicode转换为ASCII,替换不可解析的字符
  3. 将uncodable-character-replacements转换为空格
  4. 将多个空格(制表符,换行符等)转换为单个空格
  5. 剥离前导和尾随空格
  6. s = "\n\t\n\t\n\t\tApple - Wikipedia, the free encyclopedia\n\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\n\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\tLanguage:English\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9Aragon\xc3\xa9sAsturianuAz\xc9\x99rbaycanca\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbeB\xc3\xa2n-l\xc3\xa2m-g\xc3\xbaBasa Banyumasan\xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba"
    
    import re
    whitespaces = re.compile('\s+', flags=re.M)
    def utf8_to_ascii(s, ws=whitespaces):
        s = s.encode("utf8")
        s = s.decode("ascii", errors="replace")
        s = s.replace(u"\ufffd", " ")
        s = ws.sub(" ", s)
        return s.strip()
    
    s = utf8_to_ascii(s)
    

    最终导致字符串

    Apple - Wikipedia, the free encyclopedia Language:English Aragon sAsturianuAz rbaycanca B n-l m-g Basa Banyumasan
    

答案 4 :(得分:0)

假设默认的ascii编码,我们可以在一行中很好地完成这项工作,没有恶魔正则表达式;),通过迭代字符串并使用ord(i) < 128基于编码值删除值或者我们选择的任何规格:

>>> ' '.join(''.join([i if ord(i) < 128 else ' ' for i in mystring]).split())
#Output:
Apple - Wikipedia, the free encyclopedia Language:English Aragon sAsturianuAz rbaycanca B n-l m-g Basa Banyumasan

或者我们可以指定一串允许的字符并使用'in',就像使用内置字符一样  string.ascii_letters

>>> import string
>>> ' '.join(''.join([i if i in string.ascii_letters else ' ' for i in mystring]).split())
#Output:
Apple Wikipedia the free encyclopedia Language English Aragon sAsturianuAz rbaycanca B n l m g Basa Banyumasan

这也删除了标点符号(但如果我们想要,我们可以通过将这些字符添加回字符串检查定义来轻松避免,check = string.ascii_letters + ',.-:'