2013-05-31 8 views
10

Ecco il mio codice:Python ricerca di espressioni regolari per la stringa all'inizio della riga nel file di

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

che restituisce i dati, ma ho bisogno di specifica corrispondenza espressione regolare: ad esempio:

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

Se cambio il mio codice semplicemente:

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

o anche

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

Non ritorno nulla. Ho bisogno di essere in grado di utilizzare vera regex di come in Perl

+0

E perché non stai usando 're.search (r"^\ s * [^ #] * IgnoreRhosts \ s + yes ", f.read())'? –

+0

La sintassi regex di Python è la stessa di perl – SethMMorton

+0

Se^Ign non funziona, allora non c'è modo che r '^ \ s * [^ #] * IgnoreRhosts \ s + sì' funzionerebbe. Stavo cercando il minimo comune denominatore. –

risposta

16

È possibile utilizzare la modalità multi poi^corrispondere l'inizio di una riga:

#!/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)) 

Nota che senza questa modalità si può sempre sostituire ^ da \n

Nota anche che questo file è calibrato come un pomodoro così:

^IgnoreRhosts\s+yes 

è abbastanza buono per la verifica della par ameter


EDIT: un modo migliore

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

ancora una volta non v'è alcun motivo per avere spazi iniziali. Tuttavia, se vuoi essere sicuro di poter sempre usare lstrip().

+3

Cosa vuoi dire è calibrato come un pomodoro? –

+0

@GlitchCowboy: sempre lo stesso –

+0

OK, multiline era la magia. 'strings = re.findall (r"^\ s * [^ #] * IgnoreRhosts \ s + sì ", f.read(), flags = re.MULTILINE) per articolo nelle stringhe: stampa (articolo)' –

Problemi correlati