我有一个嘈杂的数据......像
这样的东西<@ """@$ FSDF >something something <more noise>
现在我只想提取"something something"
。
有没有办法删除这两个分隔符"<"
和">"
之间的文字?
答案 0 :(得分:46)
>>> 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<>