2012-01-09 21 views
18

我有一個嘈雜的data..something像的Python:刪除2個定界符

<@ """@$ FSDF >something something <more noise> 

現在我只是想提取「什麼東西」的話.. 是否有關於如何刪除文本的方式在這兩個定界符「<」和「>」??之間?

感謝

+0

數據總是那種形式,每行一個? – vdbuilder 2012-01-09 05:51:35

+0

你想提取「某物」或刪除「<" and ">」分隔符之間的文本嗎? – 2012-01-09 05:51:46

+0

嗨..數據有多行..基本上是一個巨大的文件 我想提取「一些東西」,但使用重新和美麗的湯..突然留下我與空白文件..不太確定爲什麼..但如果我可以擦除「<" and ">」之間的文本,然後這也服務於相同的目的:) – Fraz 2012-01-09 05:53:48

回答

34

使用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。

+0

:)像一個魅力工程..謝謝 – Fraz 2012-01-09 05:56:48

+4

如果每個正則表達式的答案解釋爲什麼正則表達式工作在第一個地方,就像你做的那樣,SO會是一個更快樂的地方。 +1! – heltonbiker 2013-08-29 20:08:10

10

當然,你可以使用正則表達式。

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

上面的代碼應該這樣做。

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

re.sub功能需要一個正規表示法,並更換所有的比賽與第二個參數中的字符串中。在這種情況下,我們正在搜索<>'<.*?>')之間的所有字符並將其替換爲無('')。

?用於re用於非貪婪搜索。

更多關於re module


如果「噪聲」實際上是HTML標籤,我建議你去看看BeautifulSoup

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<> 
+0

是的,我決定他們可能需要第二個「>」例如如果你有 myname-> bob ,你會得到myname-> bob,在另一種情況下,你會得到'bob'。它真的從來不是理想的解析破碎的XML。如果「<" ">」標籤之間存在換行符,我的代碼也會失敗。感謝您閱讀我的代碼 – 2012-01-09 22:00:57

3

首先謝謝保羅斯卡丁,我用你的重做好事。這個想法是爲了打印目的而使用標籤免費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()