Регулярное выражение Python соответствует n строк после матча - PullRequest
1 голос
/ 21 октября 2019

У меня есть шаблон, который отлично работает на regexr.com с pcre, но когда я использую его с python, он ничего не соответствует. шаблон:

.*(?<=RSA SHA256:).*(?:.*\n){3}.*

и соответствует данным на веб-сайте, но когда я запускаю это на моем скрипте Python, это не так. Цель состоит в том, чтобы сопоставить Accepted publickey и следующие 3 строки. Спасибо!

скрипт ниже:

import re
Accepted_publickey=r'.*(?<=RSA SHA256:).*(?:.*\n){3}.*'
file=open('secure')
for items in file:
    re1=re.search(Accepted_publickey,items)
    if re1:
        print(re1.group())

Фактические данные:

Oct 21 17:27:21 localhost sshd[19772]: Accepted publickey for vagrant from 192.168.2.140 port 54614 ssh2: RSA SHA256:uDsE4ecSD9ElWQ5Q0fdMsbqEzOe0Hszilv8xhU6dT6M
Oct 21 17:27:22 localhost sshd[19772]: pam_unix(sshd:session): session opened for user vagrant by (uid=0)
Oct 21 17:27:22 localhost sshd[19772]: User child is on pid 19774
Oct 21 17:27:22 localhost sshd[19774]: Starting session: shell on pts/2 for vagrant from 192.168.2.140 port 54614 id 0

1 Ответ

0 голосов
/ 21 октября 2019

Вам не нужно использовать просмотр сзади, вы можете сопоставить значение.

Чтобы соответствовать 3 следующим строкам, вы можете переключить новую строку и .*, чтобы пропустить последнюю .*

^.*\bRSA SHA256:.*(?:\n.*){3}
  • ^ Начало строки
  • .*\bRSA SHA256:.* Совпадение RSA SHA256: в строке, которой предшествует граница слова
  • (?:\n.*){3} повторение 3 раза aсимвол новой строки, за которым следует сопоставление любого символа, кроме символа новой строки 3 раза

Regex demo

В вашем коде вы можете использовать read () :

import re

Accepted_publickey = r'^.*RSA SHA256:.*(?:.*\n){3}.*'
f = open('secure')
items = f.read()
re1 = re.search(Accepted_publickey, items, re.M)
if re1:
    print(re1.group())
...