Verwenden Sie Regex, um Informationen aus einem bestimmten Textformat zu erhalten

Ich habe einen Text, der Zeug wie folgt enthält:

(some text) libncursesw5-dev:amd64 depends on libc6-dev | libc-dev;(some text) libx32ncursesw5 depends on libc6-x32 (>= 2.16);(some text) libx32ncurses5-dev depends on libncurses5-dev (= 5.9+20150516-2ubuntu1);(some text) libx32ncursesw5-dev depends on libc6-dev-x32;(some text) lib32tinfo-dev depends on lib32c-dev;(some text) 

Hier ist ein vollständiges Beispiel für einen der Sätze:

 dpkg: error processing package lib32tinfo5 (--install): dependency problems - leaving unconfigured dpkg: dependency problems prevent configuration of libncurses5-dev:amd64: libncurses5-dev:amd64 depends on libc6-dev | libc-dev; however: Package libc6-dev is not installed. Package libc-dev is not installed. 

Der ganze Text ist in mehrere Absätze wie die oben aufgeteilt, jeder Absatz enthält einen dieser Sätze.

Ich würde gerne eine Regex mit re Bibliothek in Python, die mir etwas wie das mit findall Option geben würde:

 ('libc6-dev', '', 'libc-dev', '') ('libc6-x32','2.16') ('libncurses5-dev','5.9+20150516-2ubuntu1') ('libc6-dev-x32','') ('lib32c-dev','') 

In anderen Worten, ich möchte Ihre Hilfe, um aus einem solchen Text zu bekommen, ein Tupel mit den Paketen mit ihren Versionen, falls angegeben.

Ich habe diese Regex:

 (?<=depends on )([a-zA-Z0-9\-]*)(?: \([=> ]*([a-zA-Z0-9-+.]*)(?:\)))?|(?: \| )([a-zA-Z0-9\-]*)(?: \([=> ]*([a-zA-Z0-9-+.]*)(?:\)))?(?=;) 

Ich habe dieses Ergebnis:

 ('libc6-dev', '', '', '') ('', '', 'libc-dev', '') ('libc6-x32', '2.16', '', '') ('libncurses5-dev', '5.9+20150516-2ubuntu1', '', '') ('libc6-dev-x32', '', '', '') ('lib32c-dev', '', '', '') 

Wie Sie sehen können, für den Satz:

 libncursesw5-dev:amd64 depends on libc6-dev | libc-dev; 

Ich habe diese Antwort:

 ('libc6-dev', '', '', '') ('', '', 'libc-dev', '') 

Anstatt dieses:

 ('libc6-dev', '', 'libc-dev', '') 

Danke für Ihre Hilfe.

One Solution collect form web for “Verwenden Sie Regex, um Informationen aus einem bestimmten Textformat zu erhalten”

 #!/usr/bin/python2 # -*- coding: utf-8 -*- import re input = """(some text) libncursesw5-dev:amd64 depends on libc6-dev | libc-dev;(some text) libx32ncursesw5 depends on libc6-x32 (>= 2.16);(some text) libx32ncurses5-dev depends on libncurses5-dev (= 5.9+20150516-2ubuntu1);(some text) libx32ncursesw5-dev depends on libc6-dev-x32;(some text) lib32tinfo-dev depends on lib32c-dev;(some text)""" #a = [] #m = re.findall("depends on ([^\s;]+)\ \|\ ([^\s;]+)", input) # 1 #a = a + m #m = re.findall("depends on ([^\s;]+)\ \([><=]{,2} ([^;]+)\)", input) # 2, 3 #a = a + m #m = re.findall("depends on ([^\s;]+)", input) # 4, 5 #a = a + m m = re.findall("depends on ([^\s;]+)\ \|\ ([^\s;]+)|depends on ([^\s;]+)\ \([><=]{,2} ([^;]+)\)|depends on ([^\s;]+)", input) print m 

Ausgabe:

 [ ('libc6-dev', 'libc-dev', '', '', ''), ('', '', 'libc6-x32', '2.16', ''), ('', '', 'libncurses5-dev', '5.9+20150516-2ubuntu1', ''), ('', '', '', '', 'libc6-dev-x32'), ('', '', '', '', 'lib32c-dev') ] 

Du kannst es eins nach dem anderen zusammen mit | Ich weiß nicht, ob dies Ihnen helfen kann

  • Wie kann ich die ANSI-Escape-Sequenzen aus einer String in Python entfernen
  • Python konvertieren multiline zu single line
  • Verständnis der NumPy-Interpretation von String-Datentypen
  • Pythonfunktion: Variable und String
  • So entfernen Sie ^ M
  • Wie man mit Unicode in Python arbeitet?
  • Was ist StringIO in Python für die Wirklichkeit verwendet?
  • Finden Sie alle Vorkommen eines Teilstrings in Python
  • Python-Liste in einem For-Loop
  • Warum funktioniert datetime.strptime nicht in diesem einfachen Beispiel?
  • Datei in Chunks lesen - RAM-Nutzung, Strings aus Binärdateien lesen
  • Python ist die beste Programmiersprache der Welt.