Сопоставьте шаблон только тогда, когда предыдущий шаблон совпадает

У меня есть ситуация, когда мне нужно сопоставить шаблон только тогда, когда соответствует предыдущий шаблон регулярного выражения. Оба шаблона отличаются друг от друга и соответствуют друг другу в разных строках. Для exmaple

Текст

blah blah blah MyHost="xxxx"
again blah blah blah MyIp= "x.x.x.x"

Меня интересует только то, что происходит после MyHost и MyIp. У меня также есть требование, чтобы MyIp соответствовало только тогда, когда в приведенной строке есть match(MyHost="xxxx").

Я могу сопоставить как значение MyHost, так и значение MyIp отдельно, но с трудным поиском логики для соответствия требованиям согласно требованиям. Обратите внимание: я довольно новичок в python и много раз пробовал поиск и заканчиваю здесь.

+3
источник поделиться
5 ответов

MyIp должен соответствовать только тогда, когда в приведенной выше строке есть match(MyHost="xxxx").

Получить согласованную группу из индекса 1 по-разному. Вы уже знаете, что будет дальше после MyHost

\bMyHost="xxxx"\r?\n.*?MyIp=\s*\"([^"]*)

Вот демо

пример кода:

import re
p = re.compile(ur'\bMyHost="xxxx"\r?\n.*?MyIp=\s*\"([^"]*)', re.IGNORECASE)
test_str = u"blah blah blah MyHost=\"xxxx\"\nagain blah blah blah MyIp= \"x.x.x.x\""

re.findall(p, test_str)
+1
источник

Вы можете сделать это через модуль регулярных выражений.

>>> import regex
>>> s = '''blah blah blah MyHost="xxxx"
... foo bar
... again blah blah blah MyIp= "x.x.x.x"
... 
... blah blah blah MyHost="xxxx"
... again blah blah blah MyIp= "x.x.x.x"'''
>>> m = regex.search(r'(?<=MyHost="xxxx"[^\n]*\n.*?MyIp=\s*")[^"]*', s)
>>> m.group()
'x.x.x.x'

Это будет соответствовать значению MyIp, только если строка MyHost="xxxx" присутствует в предыдущей строке.

Если вы хотите перечислить оба, попробуйте приведенный ниже код.

>>> m = regex.findall(r'(?<=(MyHost="[^"]*")[^\n]*\n.*?)(MyIp=\s*"[^"]*")', s)
>>> m
[('MyHost="xxxx"', 'MyIp= "x.x.x.x"')]
+1
источник
другие ответы

Связанные вопросы


Похожие вопросы

       (?=.*? MyHost=\"xxx\" .*) .*? MyIp=\"(\S+)\" .*

xxx может быть изменен по мере необходимости. MIP будет захвачен.

Вы можете использовать python lookahead.Only, когда xxx соответствует регулярному выражению, будет идти вперед и получать IP

         (?=regex)regex1

сопоставляйте regex1 только тогда, когда регулярное выражение соответствует.

0
источник

Вы должны использовать короткое замыкание, я считаю, что python поддерживает его, При коротком замыкании второе условие будет оцениваться только в том случае, если первое верно (для операций И). Таким образом, ваш код будет выглядеть следующим образом:

 patternMatch1(MyHost) and patternMatch2(MyIp)

Здесь вы можете использовать обе функции соответствия шаблону true, если они соответствуют друг другу.

Пожалуйста, дайте мне знать, если у вас есть вопросы!

0
источник

В общем случае, если вы хотите использовать Regex, вам нужно будет совместить "MyHost" и все, что следует, и "MyIP" и следовать за ним до конца строки

Итак, в основном вы хотите написать регулярное выражение, подобное этому

MyHost = "\ W +"

Это будет соответствовать MyHost = "", и вход между ним будет установлен на W после этого вы можете получить значение W и выполнить необходимые вам вычисления.

Чтобы решить проблему, в которой вам нужно совместить Первый хост просто, если Условие может решить эту проблему, проверив имя хоста перед Ip

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос