[英]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.