Регулярное выражение для соответствия строк - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно создать регулярное выражение, которое соответствует следующей строке:

<iq from="Server_FQDN" to="pluto@domain.com/671372bf1e530fde" type="result" id="YmJ6ZlDhemSAbaw3"><turnServerResponse ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"><turnServer ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"/></turnServerResponse></iq>

В частности, меня интересует тот факт, что строка имеет тег turnServerResponse и строки username="removed" и * 1006.*.Другие строки, имеющие другое значение для имени пользователя и пароля, не должны приниматься во внимание.

Поэтому не следует принимать во внимание строку, подобную приведенной ниже, поскольку значения для username и password отличаютсячем "removed"

<iq from="Server_FQDN" to="pluto@domain.com/671372bf1e530fde" type="result" id="YmJ6ZlDhemSAbaw3"><turnServerResponse ip="1.1.1.1" port="3478" username="aaa" password="bbb" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"><turnServer ip="1.1.1.1" port="3478" username="aaa" password="bbb" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"/></turnServerResponse></iq>

Ответы [ 2 ]

1 голос
/ 07 мая 2019

как насчет:

if string.find('turnServerResponse')>0 and \
   string.find('username="removed"')>0 and \
   string.find('password="removed"')>0:
    doSomething()
0 голосов
/ 07 мая 2019

Я бы сделал это следующим образом:

import re
txt = '''something
<iq from="Server_FQDN" to="pluto@domain.com/671372bf1e530fde" type="result" id="YmJ6ZlDhemSAbaw3"><turnServerResponse ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"><turnServer ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"/></turnServerResponse></iq>
something
<iq from="Server_FQDN" to="pluto@domain.com/671372bf1e530fde" type="result" id="YmJ6ZlDhemSAbaw3"><turnServerResponse ip="1.1.1.1" port="3478" username="aaa" password="bbb" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"><turnServer ip="1.1.1.1" port="3478" username="aaa" password="bbb" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"/></turnServerResponse></iq>
something'''
lines = re.findall(r'^.*?<turnServerResponse.*?username="removed" password="removed".*$',txt,re.M)
print(lines) #list of found lines

Вывод:

['<iq from="Server_FQDN" to="pluto@domain.com/671372bf1e530fde" type="result" id="YmJ6ZlDhemSAbaw3"><turnServerResponse ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"><turnServer ip="1.1.1.1" port="3478" username="removed" password="removed" guid="f72d4f2f-e3f9-4ae9-b91f-c651280635aa"/></turnServerResponse></iq>']

Объяснение: Третий аргумент re.findall означает, что ^ и $ означают начало иконец строки соответственно.Шаблон означает, что я ищу строку, содержащую <turnServerResponse, за которой следует username="removed" password="removed", возможно, с некоторыми символами между ними.

Отказ от ответственности: обратите внимание, что мой метод будет перехватывать все строки, которые имеют username="removed" password="removed" после <turnServerResponse, даже если первый произойдет вне тега turnServerResponse.Однако в вашем случае использования это может быть неуместно (такая ситуация невозможна), поэтому вы должны проверить себя, возможна ли описанная ситуация при вашем использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...