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

  • Statische vs Instanz Methoden von Str in Python
  • Wie man ein paar markierte Strings aus einer Linie (Python)
  • Python-Byte-String wird im Wörterbuch falsch gedruckt
  • Ziehen Sie einen bestimmten Teilstring aus einer Linie in Python
  • Finden von Vorkommen eines Wortes in einer Zeichenkette in Python 3
  • Python3.4 Wie lösche ich einen Textabschnitt nach Muster-String-Match
  • Str.startswith () funktioniert nicht wie ich beabsichtigte
  • Python und string extraktion
  • Ziemlich grundlegende String-Erweiterung in Python?
  • NameError: name 'book' ist nicht definiert [duplicate]
  • Wie finden und ersetzen Sie mehrere Zeilen in Textdatei?
  • Python ist die beste Programmiersprache der Welt.