问题:为什么如下所述是切断某些字段的最后一个字符的代码?
我有一个字符串,我需要解析,拆分,然后作为键/值导入到dict中。我遇到的问题是一个字段可能包含多个嵌入的逗号分隔子字段,但在这些情况下,逗号前面有三个反斜杠。我有99%的代码工作但由于某种原因使用下面的代码(我认为应该工作)导致所有其他字段的最后一个字符被剥离。我想我理解"反斜杠瘟疫"在Python Regex中,我尝试了几种方法,但找不到两种方法都不会拆分" ConfigChangeData"并且不会删除其他字段的最后一个字符。
首先,这是我开始的字符串(在一个名为data的变量中):
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:
答案 0 :(得分:2)
你的正则表达式模式消耗了逗号之前的最后一个字符,因为该字符是你要分割的模式的一部分。它是由模式的丑陋[^\\\\]
位匹配的字符。
我认为你想要一个负面观察。这将让你检查前面的字母是不是反斜杠,而不是在匹配中实际包含该字符。
csvlist=re.split(r"(?<!\\),", data)
请注意,我使用原始字符串,因此您只需要两个反斜杠,而不是您最初使用的四个反斜杠。
答案 1 :(得分:0)
你的re.split模式需要一个lookbehind,以便逗号前的字符不包含在分隔符中(即分裂字符)
re.split(r"(?<=[^\\]),",data)