Modification du contenu d'une ligne avec re et recherche
mammifères
J'essaye de changer certaines lignes dans un fichier xml. Le code ci-dessous peut changer la balise de titre mais je ne peux pas changer la balise de desc avec re et remplacer. J'essaie de majuscules pour tous les caractères des balises title et desc.
toto.xml
<programme start="20200610110000 +0300" stop="20200610114000 +0300" channel="beIN SERIES SCI-FI HD">
<title lang="tr">Charmed S2 B5</title>
<category lang="tr">Life Style</category>
<desc lang="tr">Tür: Fantastik
[the truth about kat and dogs, 2.sezon, 2019] mel ve maggie, kaybolan macy'yi̇ büyü yoluyla bulmaya çalişirken harry, farkli bi̇r metod dener...
1998 yapimi 'charmed' di̇zi̇si̇ni̇n yeni̇den çevri̇mi̇nde cadilik yeteneği̇ne sahi̇p üç kizkardeşi̇n hi̇kayesi̇ kaldiği yerden devam edi̇yor... Her bi̇ri̇ farkli güçlere sahi̇p mel, macy ve maggie'ni̇n doğaüstü kötücül güçlere karşi koyduğu 'charmed'in yeni̇ sezonunu kaçirmayin!</desc>
</programme>
test.py
import os,re
file = open('foo.xml', 'r', encoding='utf8')
lines = file.readlines()
file.close()
c = open('new.xml', 'w', encoding='utf8')
for line in lines:
title = re.search('<title lang=".*?">(.*?)<', line, re.IGNORECASE)
desc = re.search('<desc lang=".*?">([^;]*)<\/desc>', line, re.MULTILINE)
if title:
title = title.group(1)
l = line.replace(title, title.upper())
c.write(l)
else:
if desc:
desc = desc.group(1)
n = line.replace(desc, desc.upper())
c.write(n)
else:
c.write(line)
Comme l'a suggéré Alexander Pushkarev, j'ai changé le code comme ci-dessous, mais le nouveau fichier xml est identique au fichier d'origine. Qu'est-ce que je manque?
tree = ET.parse('foo.xml')
root = tree.getroot()
for child in root:
# tree = ET.fromstring(xml_text)
el = tree.find(".//title")
el.text = el.text.upper()
# Look for desc element
el = tree.find(".//desc")
el.text = el.text.upper()
tree.write('new.xml')
Alexandre Pouchkarev
L'utilisation d'expressions régulières pour traiter XML est une mauvaise idée: pourquoi est-ce une si mauvaise idée d'analyser XML avec regex?
Ce dont vous avez probablement besoin est d'utiliser xml.etree.ElementTree:
>>> import xml.etree.ElementTree as ET
>>> xml_text = u'''<programme start="20200610110000 +0300" stop="20200610114000 +0300" channel="beIN SERIES SCI-FI HD">
... <title lang="tr">Charmed S2 B5</title>
... <category lang="tr">Life Style</category>
... <desc lang="tr">Tür: Fantastik
... [the truth about kat and dogs, 2.sezon, 2019] mel ve maggie, kaybolan macy'yi̇ büyü yoluyla bulmaya çalişirken harry, farkli bi̇r metod dener...
... 1998 yapimi 'charmed' di̇zi̇si̇ni̇n yeni̇den çevri̇mi̇nde cadilik yeteneği̇ne sahi̇p üç kizkardeşi̇n hi̇kayesi̇ kaldiği yerden devam edi̇yor... Her bi̇ri̇ farkli güçlere sahi̇p mel, macy ve maggie'ni̇n doğaüstü kötücül güçlere karşi koyduğu 'charmed'in yeni̇ sezonunu kaçirmayin!</desc>
... </programme>'''
# Now we parse the document
>>> tree = ET.fromstring(xml_text)
# Look for title element
>>> el = tree.find(".//title")
>>> el.text = el.text.upper()
>>> el.text
'CHARMED S2 B5'
# Look for desc element
>>> el = tree.find(".//desc")
>>> el.text = el.text.upper()
>>> el.text
"TÜR: FANTASTIK\n[THE TRUTH ABOUT KAT AND DOGS, 2.SEZON, 2019] MEL VE MAGGIE, KAYBOLAN MACY'Yİ BÜYÜ YOLUYLA BULMAYA ÇALIŞIRKEN HARRY, FARKLI BİR METOD DENER...\n1998 YAPIMI 'CHARMED' DİZİSİNİN YENİDEN ÇEVRİMİNDE CADILIK YETENEĞİNE SAHİP ÜÇ KIZKARDEŞİN HİKAYESİ KALDIĞI YERDEN DEVAM EDİYOR... HER BİRİ FARKLI GÜÇLERE SAHİP MEL, MACY VE MAGGIE'NİN DOĞAÜSTÜ KÖTÜCÜL GÜÇLERE KARŞI KOYDUĞU 'CHARMED'IN YENİ SEZONUNU KAÇIRMAYIN!"
>>> ET.tostring(tree)
b'<programme start="20200610110000 +0300" stop="20200610114000 +0300" channel="beIN SERIES SCI-FI HD">\n <title lang="tr">CHARMED S2 B5</title>\n <category lang="tr">Life Style</category>\n <desc lang="tr">TÜR: FANTASTIK\n[THE TRUTH ABOUT KAT AND DOGS, 2.SEZON, 2019] MEL VE MAGGIE, KAYBOLAN MACY\'Yİ BÜYÜ YOLUYLA BULMAYA ÇALIŞIRKEN HARRY, FARKLI BİR METOD DENER...\n1998 YAPIMI \'CHARMED\' DİZİSİNİN YENİDEN ÇEVRİMİNDE CADILIK YETENEĞİNE SAHİP ÜÇ KIZKARDEŞİN HİKAYESİ KALDIĞI YERDEN DEVAM EDİYOR... HER BİRİ FARKLI GÜÇLERE SAHİP MEL, MACY VE MAGGIE\'NİN DOĞAÜSTÜ KÖTÜCÜL GÜÇLERE KARŞI KOYDUĞU \'CHARMED\'IN YENİ SEZONUNU KAÇIRMAYIN!</desc>\n </programme>'
Si vous avez plusieurs éléments title
et desc
- utilisezfindall
>>> import xml.etree.ElementTree as ET
>>> xml_text = u'''<programme start="20200610110000 +0300" stop="20200610114000 +0300" channel="beIN SERIES SCI-FI HD">
... <title lang="tr">title1</title>
... <category lang="tr">Life Style</category>
... <desc lang="tr">desc1</desc>
... <title lang="tr">title2</title>
... <category lang="tr">Life Style</category>
... <desc lang="tr">desc2</desc>
... </programme>'''
# Now we parse the document
>>> tree = ET.fromstring(xml_text)
>>> els = tree.findall(".//title")
>>> for el in els:
>>> el.text = el.text.upper()
>>> els = tree.findall(".//desc")
>>> for el in els:
>>> el.text = el.text.upper()
>>> ET.tostring(tree)