問題:爲什麼如下所述是代碼切斷了一些字段的最後一個字符?問題與反斜坡鼠疫和re.split
我有一個字符串,我需要解析,拆分,然後作爲鍵/值導入字典。我的問題是一個字段可能包含多個嵌入逗號分隔的子字段,但在這些情況下,逗號前有三個反斜槓。我有代碼99%的工作,但由於某種原因使用下面的代碼(我認爲應該工作)導致所有其他領域的最後一個字符被剝奪。我認爲我理解Python Regex中的「反斜槓瘟疫」,我嘗試了幾種方法,但是找不到既不會分裂「ConfigChangeData」也不會放棄其他字段的最後一個字符的方法。
首先,這裏是我開始的字符串(在一個變量稱爲數據):
2015-10-05 18:08:47,186 root INFO <181>Oct 5 17:09:10 someservername Administrative_and_Operational_Audit 0000419602 1 0 2015-10-05 17:09:10.841 -05:00 0000006065 52001 NOTICE Configuration-Changes: Changed configuration, Version=someversion.x86_64, ConfigVersionId=150, AdminInterface=GUI, AdminIPAddress=192.168.1.77, AdminSession=46CE916D0502A641592B105FF7CB3B70, AdminName=admin, ConfigChangeData='RADIUS:Shared Secret'='********'\\\,'TACACS+:Shared Secret'='********'\\\,'IP Address'='127.0.0.91/32', ObjectType=Network Device, ObjectName=testclient, ObjectId=4072, inLocalMode=false,
這裏是我的代碼:
##split the syslog data into CSV's in a list
#Here be dragons: One field, "ConfigChangeData" can have multiple embedded
#subfields. This is indicated by three trailing backslashes
#The following line needs to split on commas NOT proceeded by a backslash
csvlist=re.split("[^\\\\],", data)
AVPdict=dict()
##Create an Attribute/value pair by analysing the CSV values
##If the CSV value represents a AVP pair (detected by presense of an = sign)
##add it to the AVP dict
for csv in csvlist:
logger.debug("csv: %s" %(csv))
if re.search("=", csv):
csv=csv.strip() # clear out some embedded whitespace
attribute,value=csv.split("=", 1)
AVPdict[attribute]=value
下面是從日誌輸出:
2015-10-05 18:08:47,189 root DEBUG csv: Version=someversion.x86_6
2015-10-05 18:08:47,190 root DEBUG csv: ConfigVersionId=15
2015-10-05 18:08:47,190 root DEBUG csv: AdminInterface=GU
2015-10-05 18:08:47,190 root DEBUG csv: AdminIPAddress=192.168.7
2015-10-05 18:08:47,191 root DEBUG csv: AdminSession=46CE916D0502A641592B105FF7CB3B7
2015-10-05 18:08:47,191 root DEBUG csv: AdminName=admi
2015-10-05 18:08:47,191 root DEBUG csv: ConfigChangeData='RADIUS:Shared Secret'='********'\\\,'TACACS+:Shared Secret'='********'\\\,'IP Address'='127.0.0.91/32
2015-10-05 18:08:47,192 root DEBUG csv: ObjectType=Network Devic
2015-10-05 18:08:47,192 root DEBUG csv: ObjectName=testclien
2015-10-05 18:08:47,192 root DEBUG csv: ObjectId=407
2015-10-05 18:08:47,193 root DEBUG csv: inLocalMode=fals
2015-10-05 18:08:47,193 root DEBUG csv:
'「\\\\」包括'是與'r'\''相同。我不確定你的3個反斜槓在哪裏。 –
這三個反斜槓是在匹配的字符串中:ConfigChangeData ='RADIUS:Shared Secret'='********'\\\,'TACACS +:Shared Secret'='******* *'\\\,'IP Address'='127.0.0.91/32': – wvunathans