如何删除两个分隔符之间的单词?

时间:2012-01-09 05:48:28

标签: python

我有一个嘈杂的数据......像

这样的东西
<@ """@$ FSDF >something something <more noise>

现在我只想提取"something something"。 有没有办法删除这两个分隔符"<"">"之间的文字?

5 个答案:

答案 0 :(得分:46)

使用regular expressions

>>> import re
>>> s = '<@ """@$ FSDF >something something <more noise>'
>>> re.sub('<[^>]+>', '', s)
'something something '

[更新]

如果您尝试了<.+>这样的模式,其中点表示任何字符,加号表示一个或多个,您知道它不起作用。

>>> re.sub(r'<.+>', s, '')
''

为什么!?!这是因为正则表达式默认是“贪婪的”。表达式将匹配任何内容,直到字符串结束,包括> - 这不是我们想要的。我们希望匹配<并停留在下一个>,因此我们使用[^x]模式,这意味着“除了x之外的任何字符”(x为>)。

?运算符将匹配“非贪婪”,因此具有相同的效果:

>>> re.sub(r'<.+?>', '', s)
'something something '

前一个更明确,这个更少打字;请注意x?表示零或一次出现x。

答案 1 :(得分:14)

当然,您可以使用正则表达式。

import re
s = #your string here
t = re.sub('<.*?>', '', s)

上面的代码应该这样做。

答案 2 :(得分:4)

首先,谢谢Paulo Scardine,我用你的方法来做伟大的事情。我们的想法是使用免费的LibreOffice po文件进行打印。我制作了以下脚本,它将清理帮助文件,以便更小更简单。

import re
f = open('a.csv')
text = f.read()
f.close()

clean = re.sub('<[^>]+>', ' ', text)

f = open('b.csv', 'w')
f.write(clean)
f.close()

答案 3 :(得分:3)

import re
my_str = '<@ """@$ FSDF >something something <more noise>'
re.sub('<.*?>', '', my_str)
'something something '

re.sub函数采用常规表达式,并用第二个参数替换字符串中的所有匹配项。在这种情况下,我们会搜索<>'<.*?>')之间的所有字符,并将其替换为空('')。

? re用于非贪婪搜索。

有关re module的更多信息。


如果“噪音”实际上是html标签,我建议你研究BeautifulSoup

答案 4 :(得分:1)

只是为了兴趣,您可以编写一些代码,例如:

with open('blah.txt','w') as f:
    f.write("""<sdgsa>one<as<>asfd<asdf>
<asdf>two<asjkdgai><iasj>three<fasdlojk>""")

def filter_line(line):
    count=0
    ignore=False
    result=[]
    for c in line:
        if c==">" and count==1:
            count=0
            ignore=False
        if not ignore:
            result.append(c)
        if c=="<" and count==0:
            ignore=True
            count=1
    return "".join(result)

with open('blah.txt') as f:
    print "".join(map(filter_line,f.readlines()))

>>> 
<>one<>asfd<>
<>two<><>three<>