2013-05-31 23 views
10

Dưới đây là mã của tôi:Python regex tìm kiếm cho chuỗi ở đầu dòng trong tập tin

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

Đó trả về dữ liệu, nhưng tôi cần phù hợp với regex cụ thể: ví dụ:

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

Nếu tôi thay đổi mã của tôi chỉ đơn giản là:

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

hoặc thậm chí

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

Tôi không nhận lại được gì. Tôi cần phải có khả năng sử dụng thực tế của regex như trong perl

+0

Và tại sao bạn không sử dụng 're.search (r^^ \ s * [^ #] * IgnoreRhosts \ s + có", f.read()) '? –

+0

Cú pháp regex của Python giống với cú pháp – SethMMorton

+0

của perl Nếu^Ign không hoạt động, thì không có cách nào r '^ \ s * [^ #] * IgnoreRhosts \ s + yes' sẽ hoạt động. Tôi đang tìm mẫu số chung thấp nhất. –

Trả lời

16

Bạn có thể sử dụng chế độ multiline rồi^phù hợp với khởi đầu của một dòng:

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

Lưu ý rằng nếu không có chế độ này, bạn luôn có thể thay thế ^ bởi \n

Lưu ý quá mà tập tin này được hiệu chỉnh như một quả cà chua như sau:

^IgnoreRhosts\s+yes 

là đủ tốt để kiểm tra mệnh ameter


EDIT: một cách tốt hơn

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

hơn một lần không có lý do gì để có không gian hàng đầu. Tuy nhiên, nếu bạn muốn chắc chắn bạn luôn có thể sử dụng lstrip().

+3

Ý bạn là nó được hiệu chuẩn như cà chua? –

+0

@GlitchCowboy: luôn luôn giống như –

+0

OK, multiline là ma thuật. 'strings = re.findall (r"^\ s * [^ #] * IgnoreRhosts \ s + có ", f.read(), flags = re.MULTILINE) cho mục theo chuỗi: in (mục)' –

Các vấn đề liên quan