2017-09-22 1 views
2

Ich versuche Regex zu verwenden, um einen Ausdruck zu finden, und hier ist das, was ich versuche,Python Regex Suche mit gierigen Operator

import re 
h1= open("test.txt") 
for ln in h1: 
    ln = ln.rstrip() 
    if re.search("^From:[email protected]", ln): 
     print(ln) 

Gemäß der Logik tun sollte es die Suche an der Haltestelle ‚@‘, aber in meinem Fall, dass nicht passiert, bekomme ich die folgende Ausgabe: Von: [email protected]

Ich habe auch versucht, einen Qualifier '?' aber es scheint nicht zu funktionieren. Kann jemand vorschlagen, warum es nicht funktioniert oder wie kann ich es konkret mit Regex arbeiten lassen?

+3

Was versuchen Sie zu bekommen-was ist Ihre erwartete Ausgabe? – abccd

+0

Meine erwartete Ausgabe sollte sein: "From: ray", sollte es nicht über '@' gehen – Rookie111

+0

@ Rookie111 Versuchen Sie diese Regex 'From: [^ @] +' –

Antwort

1

Wenn Regex ist das einzige, was Sie sind Ich suche nach, Dann kannst du sowas versuchen.

Probleme:

1. Sie sollten nicht ganze Zeile drucken.

2. sollten Sie ^From:[^@]+ verwenden, um zu verhindern Anpassung von @

Try this code snippet here

import re 
h1= open("test.txt") 
for ln in h1: 
    ln = ln.rstrip() 
    result = re.search("^From:[^@]+", ln) 
    if result is not None: 
     print(result.group(0)) 

Try regex demo here

+1

Vielen Dank @Sahil Gulati, das hat funktioniert! Ich bin in der Lage, den Ausdruck zu extrahieren. – Rookie111

+0

@ Rookie111 Willkommen Freund ... Froh, Ihnen zu helfen ... :) –

2

Sie die gesamte Zeile drucken, können Sie stattdessen tun:

print(ln.split('@')[0]) 
+0

Vielen Dank @salparadise Ja, das hat für mich auch früher funktioniert. Allerdings frage ich mich, ob sich das von früheren Versionen von Python geändert hat. Weil derselbe Code, den ich oben erwähnt habe, für mich funktioniert hat, ohne dass ich die split() -Funktion beim Drucken angegeben habe. Also ich denke, das ist der einzige Weg, um es zum Laufen zu bringen? – Rookie111

+0

@ Rookie111 bessere Wege, um dies zum Laufen zu bringen, siehe die Regex und nicht-Regex Antworten. – salparadise

+0

@ Rookie111 überprüfen Sie die obige Antwort, die ich mit Regex bereitgestellt habe. – bhansa

1

Regex Lösung:

# regex = r"(.+?)@" 

import re 
h1= open("test.txt") 
regex = r"(.+?)@" 
for ln in h1: 
    ln = ln.rstrip() 
    matches = re.search(regex, ln) 
    if matches: 
     for groupNum in range(0, len(matches.groups())): 
      groupNum = groupNum + 1 
      print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = matches.start(groupNum), end = matches.end(groupNum), group = matches.group(groupNum))) 

Andere Art und Weise durch Spaltung und mit starts:

h1= open("test.txt") 
for ln in h1: 
    if ln.startswith("From: "): 
     print(ln.split("@")[0]) 

# Output From: ray 
+0

Vielen Dank an alle .. Es war sehr hilfreich. Ich habe jetzt die Regex funktioniert. – Rookie111