2016-04-18 12 views
1

ich einig XML-Text wie folgen aussehen:Konvertieren regexp Muster in Klein

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>' 

Ich will alles in den <seg rend="small"> Klein werden, wie:

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

ich verschiedene Varianten von etwas versucht habe, wie das in Python:

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

Aber es funktioniert nicht und ich bekomme seltsame Ergebnisse wie <seg rend="small">aDRE</seg>, keine Ahnung warum. Könnte mir bitte jemand helfen? Danke im Voraus!

+0

[Nicht Parsen von XML mit Regex] (http://StackOverflow.com/a/1732454/1547004) –

Antwort

1

Sie regex verwenden ..

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

Perfekt! Danke vielmals!!!! –

1

Zuerst nicht HTML mit Regex analysieren. Davon abgesehen, könnten Sie lxml verwenden:

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 

Ausgang:

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

Hallo! Danke für deine Antwort, aber die Sache ist, dass ich mich mit sehr beschissenem HTML beschäftige, nicht einmal gut gemacht, so dass ich nicht direkt mit lxml arbeiten kann. Vielleicht hätte ich das an erster Stelle sagen sollen. Vielen Dank! –

+0

Ja, die Frage "XML" zu markieren, wenn die Daten nicht XML sind, ist wahrscheinlich keine gute Idee. –