2013-05-31 14 views
10

Hier ist mein Code:Python Regex Suche nach Zeichenfolge am Anfang der Zeile in der Datei

#!/usr/bin/python 
import io 
import re 
f = open('/etc/ssh/sshd_config','r') 
strings = re.search(r'.*IgnoreR.*', f.read()) 
print(strings) 

, die Daten zurückgibt, aber ich brauche spezifische Regex Matching: zB:

^\s*[^#]*IgnoreRhosts\s+yes 

Wenn ich den Code ändern einfach:

strings = re.search(r'^IgnoreR.*', f.read()) 

oder sogar

strings = re.search(r'^.*IgnoreR.*', f.read()) 

Ich bekomme nichts zurück. Ich muss in der Lage, echte regex ist wie

+0

Und warum verwenden Sie nicht 're.search (r"^\ s * [^ #] * IgnoreRhosts \ s + ja ", f.read())'? –

+0

Python Regex-Syntax ist die gleiche wie Perle – SethMMorton

+0

Wenn^Ign nicht funktioniert, dann gibt es keine Möglichkeit, r '^ \ s * [^ #] * IgnoreRhosts \ s + ja' würde funktionieren. Ich suchte nach dem kleinsten gemeinsamen Nenner. –

Antwort

16

in Perl zu verwenden, können Sie den mehrzeiligen Modus verwenden dann^den Anfang einer Zeile entsprechen:

#!/usr/bin/python 
import io 
import re 
f = open('/etc/ssh/sshd_config','r') 

strings = re.search(r"^\s*[^#]*IgnoreRhosts\s+yes", f.read(), flags=re.MULTILINE) 
print(strings.group(0)) 

Beachten Sie, dass ohne diesen Modus, den Sie immer ^ durch \n ersetzen

Hinweis zu, dass diese Datei als eine Tomate so kalibriert ist:

^IgnoreRhosts\s+yes 

ist gut genug für die par Überprüfung messer


EDIT: ein besserer Weg

with open('/etc/ssh/sshd_config') as f: 
    for line in f: 
     if line.startswith('IgnoreRhosts yes'): 
      print(line) 

Noch einmal gibt es keinen Grund führende Leerzeichen zu haben. Wenn Sie jedoch sicher sein wollen, können Sie immer lstrip() verwenden.

+3

Was meinst du, es ist wie eine Tomate kalibriert? –

+0

@GlitchCowboy: immer gleich –

+0

OK, Multiline war die Magie. 'strings = re.findall (r"^\ s * [^ #] * IgnoreRhosts \ s + yes ", f.read(), flags = re.MULTILINE) für Artikel in Strings: print (item)' –

Verwandte Themen