2016-08-10 1 views
0

Ich muss eine Regex formulieren, um nur den ersten Teil einer bestimmten Zeichenfolge statt den zweiten Teil abholen. Zum Beispiel:Oder Anweisungen für die komplexe Regex-Bildung in Python

 (part1)      (Part2)  
     SAI       Table 


             Cloth 


     DARA         

Ich möchte nur SAI (das heißt Teil1 und nicht Teil2) extrahieren. Beachten Sie, dass die zweite Zeile in Teil 1 leer ist und daher ein leeres Leerzeichen zurückgeben sollte (und nicht cloth). Derselbe Regex muss für alle drei Fälle von Strings funktionieren. Im Fall von String2-Teil muss ein Leerzeichen zurückgegeben werden und nicht table. Es gibt keine bestimmte Länge von Räumen zwischen den beiden Teilen. Es variiert.

Dies ist die regex Ich habe versucht, aber es funktioniert nur für string1 und string3:

[\s]{1,}((?:[a-zA-Z)(@\-,."'',&*]+[\s]?)+)[\s]{2,} 

Gibt es eine Möglichkeit, einen regulären Ausdruck zu schreiben, die in diesem Fall funktionieren würde?

Ich kann Regex hier nur verwenden, da ich es brauche, um irgendeine vorhandene Zeichenfolge zurückzugeben. Die Zeichenfolge kann alphanumerisch sein und die am häufigsten verwendeten Symbole in meiner früheren Regex enthalten. Der Abstand zwischen den beiden ist niemals festgelegt.

Ich brauche es auch einen Raum zurück, wo er 1. leer ist zum Teil Wir 2. Teil ignorieren Aber ich muss sicherstellen, dass die Regex nicht Teil Sie 2.

+2

Sie sollten einige weitere Informationen zur Verfügung stellen: Was sind die Eigenschaften des Teils, den Sie übereinstimmen möchten? nur Großbuchstaben? bestimmte Länge? Brauchst du Regex oder kannst du einfach 'Split' auf den Whitespaces verwenden? – DeepSpace

+0

Gibt es Trennzeichen zwischen Teil1 und Teil2? d. h. Leerzeichen, Tabulator, ... – Trimax

+0

Das ist das Problem. Es gibt keine bestimmte Länge von Räumen zwischen den beiden Teilen. Es variiert. Kann hier nur regex verwenden, da ich dort eine vorhandene Zeichenfolge zurückgeben muss. Die Zeichenfolge kann alphanumerisch sein und die am häufigsten verwendeten Symbole in meiner früheren Regex enthalten. Der Abstand zwischen den beiden ist niemals festgelegt. Und ich brauche es, um ein Leerzeichen zurückzugeben, wo es in Teil 1 leer ist. Wir können Teil 2 ignorieren.Aber stellen Sie sicher, dass die Regex Teil 2 nicht als Teil1 erkennt, wenn Teil1 leer ist wie in Fall2. – megh2017

Antwort

0

Mit dem Namen einfangenden Gruppen überein zwischen erfassten Teile sind in der Lage zu unterscheiden:

(?: +(?P<one>(?:\w+)?))?(?: +(?P<two>(?:\w+)?)) 

Live demo

1

Wenn die erste Spalte (Teil1) ist immer verfolgt um 2 Leerzeichen, während das zweite (part2) nicht ist, können Sie sich auf diese Bedingung verlassen, um eine Übereinstimmung in der letzten Spalte zu verhindern. Wir können die lookahead(?=[\t ]{2}) verwenden, um für 2 aufeinander folgende Leerzeichen oder Tabs zu behaupten.

-Code

import re 

patt = r'^[\t ]*(\S+(?:[\t ]\S+)*(?=[\t ]{2})|)' 
str = r''' 
     (part1)      (Part2)  
     SAI       Table 
             Cloth 
     DARA         
''' 

print re.findall(patt, str, re.MULTILINE) 

Ausgabe

['(part1)', 'SAI', ' ', 'DARA'] 

ideone demo

Sie können auch \S zu [a-zA-Z)(@\-,."'',&*] ändern die zu begrenzen, erlaubte Zeichen