Tôi muốn xử lý mọi dòng trong tệp nhật ký của mình và trích xuất IP
địa chỉ nếu dòng khớp với mẫu của tôi. Có một số loại tin nhắn khác nhau, ví dụ bên dưới tôi đang sử dụng p1 and
p2`.
Tôi có thể đọc từng dòng tệp và cho từng dòng khớp với từng mẫu. Nhưng vì có thể có nhiều mẫu hơn, tôi muốn làm nó hiệu quả nhất có thể. Tôi đã hy vọng biên dịch các mẫu thos thành một đối tượng và chỉ thực hiện khớp một lần cho mỗi dòng:
import re
IP = r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
p1 = 'Registration from' + IP + '- Wrong password'
p2 = 'Call from' + IP + 'rejected because extension not found'
c = re.compile(r'(?:' + p1 + '|' + p2 + ')')
for line in sys.stdin:
match = re.search(c, line)
if match:
print(match['ip'])
nhưng đoạn mã trên không hoạt động, nó phàn nàn rằng ip
được sử dụng hai lần.
Cách thanh lịch nhất để đạt được mục tiêu của tôi là gì?
BIÊN TẬP:
Tôi đã sửa đổi mã của mình dựa trên câu trả lời từ @Dev Khadka.
Nhưng tôi vẫn đang vật lộn với cách xử lý đúng nhiều ip
trận đấu. Mã dưới đây in tất cả các IP khớp với p1:
for line in sys.stdin:
match = c.search(line)
if match:
print(match['ip1'])
Nhưng một số dòng không khớp p1
. Họ hợp nhau p2
. tức là tôi nhận được:
1.2.3.4
None
2.3.4.5
...
Làm thế nào để in các ip phù hợp, khi tôi không biết wheter nó là p1
, p2
...? Tất cả tôi muốn là IP. Tôi không quan tâm mẫu nào phù hợp.