Regex, um spezielle Listeneinträge anzupassen

Ich habe seltsame Liste von Artikeln und Listen wie diese mit | Als Trennzeichen und [[ ]] als Klammer. Es sieht aus wie das:

 | item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14 

Ich möchte Gegenstände in Listen mit Ulist* (Items 4-8) mit RegEx Uitem* und sie mit Uitem* ersetzen. Das Ergebnis sollte so aussehen:

 | item1 | item2 | item3 | Ulist1[[ | Uitem4 | Uitem5 | Ulist2[[ | Uitem6 | Uitem7 ]] | Uitem8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14 

Ich habe fast alles ausprobiert, was ich über RegEx kenne, aber ich habe keine RegEx gefunden, die jedes Element innen passend, wenn die Ulists. Meine aktuelle RegEx:

 /Ulist(\d+)\[\[(\s*(\|\s*[^\s\|]*)*\s*)*\]\]/i 

Was ist falsch? Ich bin Anfänger mit RegEx.

Es ist in Python 2.7, speziell mein Code ist:

  def fixDirtyLists(self, text): text = textlib.replaceExcept(text, r'Ulist(\d+)\[\[(\s*(\|\s*[^\s\|]*)*\s*)*\]\]', r'Ulist\1[[ U\3 ]]', '', site=self.site) return text 

text bekommt diese seltsame Liste, textlib ersetzt RegEx mit RegEx. Nicht kompliziert überhaupt

  • Kann ich mit multiline string in python ohne re.OTALL passen?
  • Summe der Strings aus Textdatei mit Regex extrahiert
  • Wie python und das regex modulieren umgekehrt
  • Eine Nummer aus der Zeichenfolge erhalten und sie verwenden, um den Text in Python zu ersetzen
  • Python Regulärer Ausdruck muss Leerzeichen ausgleichen, außer zwischen Anführungszeichen
  • Sehr langsamer regelmäßiger Ausdruck suchen
  • Python multiline regex
  • Reguläre Ausdrücke in Python unerwartet langsam
  • One Solution collect form web for “Regex, um spezielle Listeneinträge anzupassen”

    Wenn du das PyPi-Regex-Modul installierst (mit Python 2.7.9+ kann es von einem \Python27\Scripts\ pip install regex wenn es in \Python27\Scripts\ Ordner ist), kannst du in verschachtelte eckige Klammern übereinstimmen. Sie können die Saiten passen, die Sie benötigen, ersetzen Sie item mit Uitem innerhalb nur jener Teilstrings.

    Das Muster (siehe Demo , beachten Sie, dass PyPi Regex Rekursion ähnelt die von PCRE):

     (Ulist\d+)(\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]]) ^-Group1-^^-----------Group2--------------------^ 

    Eine kurze Erklärung: (Ulist\d+) ist Gruppe 1, die mit einem wörtlichen Wort Ulist gefolgt von 1 oder mehr Ziffern gefolgt von (\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]]) , die mit substrings beginnend mit [[ bis zum entsprechenden ]] übereinstimmt.

    Und der Python-Code:

     >>> import regex >>> s = "| item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14" >>> pat = r'(Ulist\d+)(\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]])' >>> res = regex.sub(pat, lambda m: m.group(1) + m.group(2).replace("item", "Uitem"), s) >>> print(res) | item1 | item2 | item3 | Ulist1[[ | Uitem4 | Uitem5 | Ulist2[[ | Uitem6 | Uitem7 ]] | Uitem8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14 

    Um zu vermeiden, dass die list in der Ulist , verwenden Sie

     def repl(m): return "".join([x.replace("item", "Uitem") if not x.startswith("list") else x for x in regex.split(r'\blist\d*\[{2}[^\]]*(?:](?!])[^\]]*)*]]', m.group(0))]) 

    Und ersetzen Sie die regex.sub mit

     res = regex.sub(pat, repl, s) 
    Python ist die beste Programmiersprache der Welt.