2014-03-18 23 views
2

我有以下代碼:的Python:應用re.sub沒有改變任何

def gettextbyxpath(tree, xpath): 
    node = tree.xpath(xpath)[0] 
    try: 
     text = etree.tostring(node, method="text", encoding='UTF-8').strip() 
     text = re.sub(' +',' ', text) 
     text = re.sub('\n+','\n', text) 
     text = re.sub('\n \n','\n', text) 
    except: 
     text = 'ERROR' 
    return text 

隨着最後一行我試圖讓與他們只是一個單一的空間,擺脫線。實際數據中有很多。

當我將上面的代碼作爲獨立測試運行時,它工作正常,但在真實代碼中,最後一行完全不起作用!我試過比較使用和不使用它的文件 - 沒有區別。

例輸入:

 Brand: 

    777,Royal Lion 



    Main Products: 

      battery, 777, carbon zinc, paper jacket, 

我試圖擺脫線之間的垂直空白的。

任何想法爲什麼我的代碼可能會像這樣?

+0

你檢查過CRLF('\ r \ n')行尾嗎? – ecatmur

+0

您必須爲您的模式使用原始字符串或轉義反斜槓。 –

+0

@CasimiretHippolyte,我確定嗎?我的意思是那裏有NEWLINE標誌。 –

回答

2

至於爲什麼你的代碼的行爲,你所描述的方法:的text,你從第二個呼叫獲取到re.sub不包含你想在你的最後一次通話,以替代模式re.sub值:

>>> text = re.sub('\n+', '\n', text) # 2nd call to re.sub 
>>> text 
>>> 'Brand:\n 777,Royal Lion\n Main Products:\n battery, 777, carbon zinc, paper jacket,' 

所以,你需要刪除從模式進行第二\n在最後通話到re.sub

text = re.sub('\n ','\n', text) 

這將產生:

Brand: 
777,Royal Lion 
Main Products: 
battery, 777, carbon zinc, paper jacket, 

替代解決方案

def gettextbyxpath(tree, xpath): 
    node = tree.xpath(xpath)[0] 
    try: 
     text = etree.tostring(node, method="text", encoding='UTF-8').strip() 
     text = '\n'.join(line.strip() for line in text.split('\n') if line.strip()) 
    except: 
     text = 'ERROR' 
    return text 

輸出

Brand: 
777,Royal Lion 
Main Products: 
battery, 777, carbon zinc, paper jacket, 

什麼是對這種做法不同的是,那而不是做連續換人re.sub我們將etree.tostring的輸出分爲\n。然後,我們過濾其結果,以便在調用.strip()時排除所有縮減爲空字符串的行。這給我們留下了只有具有實際內容的線條,從左側和右側刪除了所有空白區域。爲了獲得最終結果,我們加入一行換行(\n)。

+0

沒辦法。問題是:當我運行這樣的代碼時,它會運行得很好,就像這個's = re.sub('\ n \ n','\ n',s)'或者單獨腳本中的任何東西(某些「測試環境」 。但在現實世界中卻沒有。我甚至不知道爲什麼。 –

+0

@Minner你能否更具體地說明你的「真實世界」是什麼意思? – itsjeyd

+0

我的本地機器上的Python 2.7爬行器使用urlopen和lxml來爬網。我已經更新了問題中的代碼。節點:行首有空格。 –

1

以下代碼應除去單個空格以外的選項卡,新行和空格。

import re 

a =""" 
Brand: 

777,Royal Lion 



Main Products: 

battery, 777, carbon zinc, paper jacket, 
""" 
p = re.compile(r'[\n\t]+|[ ]{2,}') 
print p.sub('',a)