2013-05-31 14 views
10

Oto mój kod:Python wyszukiwania regex na ciąg na początku linii w pliku

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

która zwraca dane, ale potrzebują specjalnej dopasowanie regex: przykład:

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

Jeśli zmienię mojego kodu po prostu:

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

lub nawet

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

Nic nie otrzymuję. Muszę być w stanie wykorzystać prawdziwy regex jest jak w Perlu

+0

Dlaczego nie używasz 're.search (r"^\ s * [^ #] * IgnoreRhosts \ s + yes ", f.read())'? –

+0

Składnia wyrażeń regularnych w języku Python jest taka sama, jak w przypadku narzędzia perl: – SethMMorton

+0

Jeśli funkcja^Ign nie działa, to nie ma mowy, że r '^ \ s * [^ #] * IgnoreRhosts \ s + yes' zadziała. Szukałem najniższego wspólnego mianownika. –

Odpowiedz

16

Można użyć trybu wielowierszowego następnie^dopasować początek linii:

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

Należy pamiętać, że bez tego trybu można zawsze zastąpić ^ przez \n

Uwaga też, że plik ten jest kalibrowany jak pomidor sposób:

^IgnoreRhosts\s+yes 

jest wystarczająco dobra do sprawdzenia par ameter


EDIT: lepszy sposób

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

raz kolejny nie ma powodu, aby mieć spacje. Jednak jeśli chcesz mieć pewność, że zawsze możesz użyć lstrip().

+3

Co masz na myśli, że jest skalibrowany jak pomidor? –

+0

@GlitchCowboy: zawsze ten sam –

+0

OK, multilinia była magią. 'stringi = re.findall (r"^\ s * [^ #] * IgnoreRhosts \ s + yes ", f.read(), flags = re.MULTILINE) dla pozycji w łańcuchach: print (artykuł)' –

Powiązane problemy