Python 正则表达式以分号和逗号分隔,但在某些情况下除外

Python 正则表达式以分号和逗号分隔,但在某些情况下除外,python,regex,Python,Regex,我有一个用逗号分隔的字符串,但是,有些字符串是用分号和逗号分隔的日期时间。例如: 'CreationTime: 1/12/2021 6:21:07 PM, LastAccessTime: 1/12/2021 6:21:05 PM, LastWriteTime: 1/12/2021 6:21:05 PM, ChangeTime: 1/12/2021 6:21:07 PM, FileAttributes: N, AllocationSize: 4,096, EndOfFile: 3,115, Num

我有一个用逗号分隔的字符串,但是,有些字符串是用分号和逗号分隔的日期时间。例如:

'CreationTime: 1/12/2021 6:21:07 PM, LastAccessTime: 1/12/2021 6:21:05 PM, LastWriteTime: 1/12/2021 6:21:05 PM, ChangeTime: 1/12/2021 6:21:07 PM, FileAttributes: N, AllocationSize: 4,096, EndOfFile: 3,115, NumberOfLinks: 1, DeletePending: False, Directory: False, IndexNumber: 0x3000000032494, EaSize: 0, Access: Generic Read, Position: 0, Mode: Sequential Access, Synchronous IO Non-Alert, AlignmentRequirement: Word'
显然,
CreationTime:1/12/2021 6:21:07 PM
是我要解析的第一个字符串,我还想将
CreationTime
从它的属性
1/12/2021 6:21:07 PM
中分离出来,同时对每个由
分隔的项目执行此操作,其中头和属性由
分隔:

为了使事情变得更复杂,有些标题具有多个属性

Mode: Sequential Access, Synchronous IO Non-Alert
因此,
顺序访问、同步IO非警报
都是属于
模式的两个属性:
,但它们不能与
对齐要求:
之后的下一个标题的逗号分隔符混淆

问题
如果示例字符串的属性本身是分号和逗号,我如何解析示例字符串以使其返回标题和属性(例如
模式
顺序访问、同步IO非警报
)。

我认为这将起作用:

t='CreationTime:1/12/2021 6:21:07 PM,LastAccessTime:1/12/2021 6:21:05 PM,LastWriteTime:1/12/2021 6:21:05 PM,ChangeTime:1/12/2021 6:21:07 PM,FileAttributes:N,AllocationSize:4096,EndOfFile:3115,NumberOfLinks:1,DeletePending:False,Directory:False,IndexNumber:0x30000032494,EaSize:0,Access:Generic Read,Position:0,模式:顺序访问、同步IO非警报、对齐要求:Word'
#使用前瞻重新拆分,然后先拆分”:
dict([x.split(':',maxslit=1)表示在重新拆分(r',(?=[^\s::+\:)',t)]中的x)
>>>
{'CreationTime':'2021年1月12日下午6:21:07',
“LastAccessTime”:“2021年1月12日下午6:21:05”,
“LastWriteTime”:“2021年1月12日下午6:21:05”,
“变更时间”:“2021年1月12日下午6:21:07”,
“FileAttributes”:“N”,
“AllocationSize”:“4096”,
“endofile”:“3115”,
“NumberOfLinks”:“1”,
'DeletePending':'False',
'目录':'假',
“索引编号”:“0x30000000032494”,
“EaSize”:“0”,
“访问”:“一般读取”,
“位置”:“0”,
“模式”:“顺序访问,同步IO非警报”,
“对齐要求”:“Word”}
用于拆分字符串。在
[A-Za-z]+
周围加上括号以返回匹配的部分(这些部分稍后将成为字典键)。使用切片删除列表的第一个元素(空字符串):
[1://code>。最后,使用将列表转换为字典。我选择使用迭代器来实现

import re
s = 'CreationTime: 1/12/2021 6:21:07 PM, LastAccessTime: 1/12/2021 6:21:05 PM, LastWriteTime: 1/12/2021 6:21:05 PM, ChangeTime: 1/12/2021 6:21:07 PM, FileAttributes: N, AllocationSize: 4,096, EndOfFile: 3,115, NumberOfLinks: 1, DeletePending: False, Directory: False, IndexNumber: 0x3000000032494, EaSize: 0, Access: Generic Read, Position: 0, Mode: Sequential Access, Synchronous IO Non-Alert, AlignmentRequirement: Word'
it = iter(re.split(r'([A-Za-z]+):', s)[1:])
dct = dict(zip(it, it))
print(dct)
# {'CreationTime': ' 1/12/2021 6:21:07 PM, ', 'LastAccessTime': ' 1/12/2021 6:21:05 PM, ', 'LastWriteTime': ' 1/12/2021 6:21:05 PM, ', 'ChangeTime': ' 1/12/2021 6:21:07 PM, ', 'FileAttributes': ' N, ', 'AllocationSize': ' 4,096, ', 'EndOfFile': ' 3,115, ', 'NumberOfLinks': ' 1, ', 'DeletePending': ' False, ', 'Directory': ' False, ', 'IndexNumber': ' 0x3000000032494, ', 'EaSize': ' 0, ', 'Access': ' Generic Read, ', 'Position': ' 0, ', 'Mode': ' Sequential Access, Synchronous IO Non-Alert, ', 'AlignmentRequirement': ' Word'}

你提前有标题/键的列表吗?问题在哪里?@buran,没有。它们都在字符串本身中,直接位于分号之前。我需要对数千个不同标题的不同字符串执行此操作,所以我需要自适应地执行此操作。@qräbnö,用更具体的问题编辑。我无法理解否决票,抱歉。我的回答给你你所需要的。如果你想要不同的东西,你应该把它说得更清楚。我真的不明白反对票。如果你愿意,请投票。thx.我也不明白否决票。这完美地解决了我的问题。我的问题被否决了,尽管它有两个正确的答案,所以显然有人不太喜欢正则表达式。