繁体   English   中英

如何匹配 Python 中的“多个”字符串

[英]How to match exact “multiple” strings in Python

我想对 SOAP/XML 进行实时数据包监控。 这是代码。

from scapy.all import *   

def pack_callback(packet):

    if packet["TCP"].payload:  
        payload = str(packet["TCP"].payload)  

        Code = '<ResponseCode>(.*?)<|<ResponseRunTime>(.*?)<'

        pat = re.compile(Code) 
        n = pat.findall(payload)
        if n:
            #print n.groups()
            print n

sniff(filter='tcp and port 186 or port 86',prn=pack_callback,iface='vmxnet3 Ethernet Adapter')`

但是如果我使用re.search ,我得到('0', None) ,当我使用re.findall时,我得到[('0', ''), ('', '1763')]

我的问题是,我怎样才能得到('0', '1763') 我的意思是首先匹配<ResponseCode>(.*?)<然后匹配<ResponseRunTime>(.*?)<不是每次都从头搜索 XML。

SOAP 响应如下:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Body>
      <ns3:RetrieveQuotationResponse xmlns>
         <ResponseVersion>5</ResponseVersion>
         <ResponseCode>0</ResponseCode>
         <ResponseMessage>Correct Petition</ResponseMessage>
         <ResponseRunTime>1887</ResponseRunTime>
         <ResponseData>
            <billingDays>2</billingDays>
            <destinationCurrencyValue>0.0</destinationCurrencyValue>
            <dropOffDate>2018-02-23</dropOffDate>
            <dropOffOfficeId>D2</dropOffOfficeId>
            <dropOffOfficeNameParis</dropOffOfficeName>
            <dropOffTime>09:00</dropOffTime>
            <pickUpDate>2018-02-21</pickUpDate>
            <pickUpOfficeId>D2</pickUpOfficeId>
            <pickUpOfficeName>Paris</pickUpOfficeName>
            <pickUpTime>09:00</pickUpTime>
            <quotationNote>There Are 29 Car Types Availables.</quotationNote>
            <quotationOptions>

速度几乎是每秒 110 包。 这就是我希望尽可能少地保留 wordround 的原因,否则 Python 不能那么快地处理所有数据包。

谢谢。

通常,尝试使用正则表达式处理 XML 是徒劳的。 虽然正则表达式可能能够处理简单的任务,但 XML 解析的要求往往会超出正则表达式的能力,从而导致错误以及维护和可读性问题。 通常最好从一开始就使用正确的 XML 解析器。

也就是说,有一种简单的方法可以处理这种特殊情况。 findall在有多个组时返回元组,因此正则表达式中最多应该有一个组。 它可以通过使用lookarounds在没有组的情况下完成,但更简单的是将交替移动到标签名称,而不是整个匹配项。 例如:

<Response(?:Code|RunTime)>([^<]*)<

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM