簡體   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