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&#220;R: FANTASTIK\n[THE TRUTH ABOUT KAT AND DOGS, 2.SEZON, 2019] MEL VE MAGGIE, KAYBOLAN MACY\'YI&#775; B&#220;Y&#220; YOLUYLA BULMAYA &#199;ALI&#350;IRKEN HARRY, FARKLI BI&#775;R METOD DENER...\n1998 YAPIMI \'CHARMED\' DI&#775;ZI&#775;SI&#775;NI&#775;N YENI&#775;DEN &#199;EVRI&#775;MI&#775;NDE CADILIK YETENE&#286;I&#775;NE SAHI&#775;P &#220;&#199; KIZKARDE&#350;I&#775;N HI&#775;KAYESI&#775; KALDI&#286;I YERDEN DEVAM EDI&#775;YOR... HER BI&#775;RI&#775; FARKLI G&#220;&#199;LERE SAHI&#775;P MEL, MACY VE MAGGIE\'NI&#775;N DO&#286;A&#220;ST&#220; K&#214;T&#220;C&#220;L G&#220;&#199;LERE KAR&#350;I KOYDU&#286;U \'CHARMED\'IN YENI&#775; SEZONUNU KA&#199;IRMAYIN!</desc>\n  </programme>'

Si vous avez plusieurs éléments titleet 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)

Articles connexes


Modification du contenu d'une liste avec une variable

codeBit Exemple de code items = ["x", "y" "z"] myItems = [] print(items) get_items = input("Choose an Item: ") myItems.append(get_items) items.remove(get_items) print("Change Items Name?") answer = input("Yes No:") if answer == "Yes": print("Which Item?")

Python: recherche csv et retour d'une ligne entière

Meigo62 Je n'ai pas pu trouver un meilleur endroit pour poser ma question. J'apprends Python et j'essaie de créer un script comme suit. 1) Devrait être capable de rechercher le fichier csv. 2) Renvoie la ligne entière si une correspondance est trouvée. Mon csv

PowerShell recherche du texte et ajout d'une ligne

John Désolé pour le long post. Je voulais expliquer en détail. J'essaie de réaliser trois choses et j'y suis presque arrivé. Probablement une erreur d'écolier. J'ai essayé les boucles imbriquées, etc. Il semble que j'ai besoin de diviser le $resultszonetableau