2017-09-15 2 views
-1

Gibt es eine schöne Möglichkeit, in Python zu tun:Elegante Möglichkeit, zu Regex passende Teilstrings zu extrahieren?

  • Prüfen Sie den String entspricht einem Satz von regulären Ausdrücken
  • Wenn ja: die passenden Teile zurück als Tupel erhalten.

So im Wesentlichen möchte ich eine einfache Art und Weise einfache Parser/Scanner Grammatiken, eingeben und einfach alle Anpassung in einer bestimmten Struktur extrahieren (zB Tupel)

So nehmen wir haben in einem String eines Ländercode codiert ist, ein Stadtname und ein Index. Wir möchten das extrahieren:

input = "123-NEWYORK-[2]" 
grammar = "<country,[0-9]+>-<city,[A-Z]*>-[<index,[0-9]*>" 
res = HOW_TO_DO_THIS(input,grammar) 
if res is None: 
    print("Does not match") 
else 
    (countrycode,city,index) = res 
+2

Check-out dieses Buddy https://stackoverflow.com/questions/46239445/get-string-that-was-matched-by-regex/46239491 # 46239491 – babygame0ver

+0

Sie müssen das 're' Modul verwenden; Die Frage, wie sie aussieht, ist zu weit gefasst, da sie im Grunde ein Tutorial für dieses Modul verlangt. – chepner

Antwort

2

Mit python3 entsprechend Ihr Szenario erweitern Sie tun können, ist zu beachten, dass der Regex geändert wurde:

import re 
input = "123-NEWYORK-[2]" 
grammar = r"(?P<country>[0-9]+)-(?P<city>[A-Z]*)-(?P<index>\[[0-9]*\])" 
res = re.findall(grammar, input) 
if not res: 
    print("Does not match") 
else: 
    (countrycode,city,index) = res[0] 
    print(countrycode) 

Modifikationen:

  • Die richtige Regex wäre (?P[0-9]+)-(?P[A-Z])-(?P[[0-9]])
  • Die Syntax für Regex-Modul in Python ist re.findall(patter, input_string). Nicht das Gegenteil.
  • if not x ist einfacher (und mehr Generika) als if x is None
0

Überprüfen Sie diesen Code. Dies ist nur für einfachen Text Lookup, aber Sie können

import re 
f=open('sample.txt',"w") 
f.write("<p class = m>babygameover</p>") 
f.close() 
f=open('sample.txt','r') 
string = "<p class = m>(.+?)</p>" # regular expression 
pattern = re.compile(string) # compiling 
text = f.read() 
search = re.findall(pattern,text) # searching 
print search 
+0

Das ist nicht was ich suche. findall findet alle Vorkommen von 1 regexp. Ich möchte alle Vorkommen von Subregexps, die selbst nach einem bestimmten größeren Regexp platziert sind (also in dem Fall über - []. – robert

+0

@robert können Sie die Daten Zeile für Zeile lesen und machen es in einer Schleife zu tun dein Zeug – babygame0ver

Verwandte Themen