2016-04-18 37 views
1

我有一些像這樣的XML文本:轉換正則表達式模式爲小寫

text = '<sp> <speaker>T<seg rend="small">ARSIS</seg>. </speaker> <p>—Adelante, Señora. Gracias á la luz rosada, franquearemos sin tropezones este ingrato sendero.</p> </sp> <sp> <speaker>L<seg rend="small">A</seg> M<seg rend="small">ADRE</seg>. </speaker> <p>—La llovizna nos coge ahora de cara… Yo no la temo. Tengo mi rostro bien curtido para estas inclemencias que hacen á mis hijos duros, y tan insensibles al frío como al calor. Tú también te has endurecido, según veo, y te has dejado en los aires sutiles y en los ardores del sol tu antigua carita de galancete afeminado.</p>' 

我想一切都在<seg rend="small">變成小寫,如:

<sp> <speaker>T<seg rend="small">arsis</seg>. </speaker> <p>—Adelante, Señora. Gracias á la luz rosada, franquearemos sin tropezones este ingrato sendero.</p> </sp> <sp> <speaker>L<seg rend="small">a</seg> M<seg rend="small">adre</seg>. </speaker> <p>—La llovizna nos coge ahora de cara… Yo no la temo. Tengo mi rostro bien curtido para estas inclemencias que hacen á mis hijos duros, y tan insensibles al frío como al calor. Tú también te has endurecido, según veo, y te has dejado en los aires sutiles y en los ardores del sol tu antigua carita de galancete afeminado.</p> </sp> <sp> <speaker>T<seg rend="small">arsis</seg>. </speaker> <p>—En los días ásperos de la Aldehuela empecé á soltar mi máscara de cera, y cambié los goznes quebradizos de mi máquina corporal por otros de acero.</p> </sp> <sp> <speaker>L<seg rend="small">a</seg> M<seg rend="small">adre</seg>. </speaker> <p>—Al nombrar la Aldehuela traes á mi memoria algo que tenía que decirte, y es cosa en verdad lamentable. ¿Sabes que ha muerto el pobre José Caminero?</p> </sp> 

我已經試過的東西像不同的變種這在Python中:

for f in re.findall(r'<seg rend="small">([^<]*?)</seg>', text): 
     text = text.replace(f, f.lower()) 

但它不起作用,我得到奇怪的結果<seg rend="small">aDRE</seg>,不知道爲什麼。可以請任何人幫助我嗎?提前致謝!

+0

[請不要用正則表達式解析XML( http://stackoverflow.com/a/1732454/1547004) –

回答

1

您可以使用正則表達式..

>>> txt = 'foo <seg rend="small">ARSIS</seg> bar' 
>>> import re 
>>> re.sub(r'(<seg\s+rend\s*=\s*"small">)(.*?)(?=</seg>)', lambda m: m.group(1) + m.group(2).lower(), txt) 
'foo <seg rend="small">arsis</seg> bar' 
>>> 
+0

完美!非常感謝!!!! –

1

首先,不要用正則表達式解析HTML。話雖這麼說,你可以使用lxml

from lxml import html 

text = '<sp> <speaker>T<seg rend="small">ARSIS</seg>. </speaker> <p>—Adelante, Señora. Gracias á la luz rosada, franquearemos sin tropezones este ingrato sendero.</p> </sp> <sp> <speaker>L<seg rend="small">A</seg> M<seg rend="small">ADRE</seg>. </speaker> <p>—La llovizna nos coge ahora de cara… Yo no la temo. Tengo mi rostro bien curtido para estas inclemencias que hacen á mis hijos duros, y tan insensibles al frío como al calor. Tú también te has endurecido, según veo, y te has dejado en los aires sutiles y en los ardores del sol tu antigua carita de galancete afeminado.</p>' 

tree = html.fromstring(text) 
results = [x.lower() for x in tree.xpath('//seg[@rend="small"]/text()')] 
print results 

輸出:

['arsis', 'a', 'adre'] 
+1

嗨!謝謝你的回答,但問題是我處理的是非常糟糕的HTML,甚至沒有格式化,所以我不能直接使用lxml。也許我應該首先說。謝謝! –

+0

是的,當數據不是XML時,標記問題「xml」可能不是一個好主意。 –

相關問題