正则表达式匹配行

时间:2019-05-07 12:00:46

标签: python regex regular-language

我需要创建一个与以下行匹配的正则表达式:

<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"password="removed"。用户名和密码具有不同值的其他行也不应考虑。

因此,不应考虑以下一行,因为usernamepassword的值与"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 个答案:

答案 0 :(得分:1)

有关:

if string.find('turnServerResponse')>0 and \
   string.find('username="removed"')>0 and \
   string.find('password="removed"')>0:
    doSomething()

答案 1 :(得分:-1)

我将按照以下方式进行操作:

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"的行,它们之间可能有一些字符。

免责声明: 请注意,即使第一个出现在 outside 之外,我的方法也会捕获所有行,这些行在{em> username="removed" password="removed"之后是<turnServerResponse turnServerResponse标签。但是,在您的用例中,这可能是无关紧要的(这种情况是不可能的),因此您必须检查自己是否在使用中可能遇到上述情况。