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

  • Ein Regex für die Entnahme von Satz aus einem Absatz in Python
  • Regulärer Ausdruck, um 3 Großbuchstaben zu entsprechen, gefolgt von einem kleinen Brief, gefolgt von 3 Großbuchstaben?
  • Wie verstehe ich regelmäßigen Ausdruck mit Python?
  • Richtig analysieren String Literale mit Python's re Modul
  • TypeError: erwarteter String oder Puffer
  • Parsing einer kontextfreien Grammatik in Python
  • Re.compile nicht passend zu meinem String
  • Pymongo Regex $ alle mehrere Suchbegriffe
  • 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.