如何从未成形的字符串中分离字符串

use*_*449 4 python

我有这种格式的字符串

 2013-06-05T11:01:02.955 LASTNAME=Jone FIRSTNAME=Jason PERSONNELID=salalm QID=231412 READER_NAME="CAZ.1 LOBBY LEFT TURNSTYLE OUT" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370480141.000 REGION=UTAH
Run Code Online (Sandbox Code Playgroud)

其中一些看起来像这样

 2013-06-05T11:15:48.670 LASTNAME=Ga FIRSTNAME="Je " PERSONNELID=jega QID=Q10138202 READER_NAME="CAZ.1 ELEVATOR LOBBY DBL GLASS" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370481333.000 REGION=UTAH
Run Code Online (Sandbox Code Playgroud)

我想提取PERSONNELID,REGION,ACCESS_TYPE,EVENT_TIME_UTC的值

我打算使用split("")但READER_NAME和ACCESS_TYPE值有一堆空格我可以转换为JSON并按键搜索

提取这些字符串的方法是什么.

先感谢您

DSM*_*DSM 11

我发现过去有用的一个黑客就是使用shlex.split:

>>> s = '2013-06-05T11:01:02.955 LASTNAME=Jone FIRSTNAME=Jason PERSONNELID=salalm QID=231412 READER_NAME="CAZ.1 LOBBY LEFT TURNSTYLE OUT" ACCESS_TYPE="Access Granted" EVENT_TIME_UTC=1370480141.000 REGION=UTAH'
>>> split = shlex.split(s)
>>> split
['2013-06-05T11:01:02.955', 'LASTNAME=Jone', 'FIRSTNAME=Jason', 
'PERSONNELID=salalm', 'QID=231412', 'READER_NAME=CAZ.1 LOBBY LEFT TURNSTYLE OUT',
'ACCESS_TYPE=Access Granted', 'EVENT_TIME_UTC=1370480141.000', 'REGION=UTAH']
Run Code Online (Sandbox Code Playgroud)

然后我们可以把它变成一本字典:

>>> parsed = dict(k.split("=", 1) for k in split if '=' in k)
>>> parsed
{'EVENT_TIME_UTC': '1370480141.000', 'FIRSTNAME': 'Jason', 
'LASTNAME': 'Jone', 'REGION': 'UTAH', 'ACCESS_TYPE': 'Access Granted', 
'PERSONNELID': 'salalm', 'QID': '231412', 
'READER_NAME': 'CAZ.1 LOBBY LEFT TURNSTYLE OUT'}
Run Code Online (Sandbox Code Playgroud)

正如@abarnert指出的那样,如果您愿意,可以保留更多信息:

>>> dict(k.partition('=')[::2] for k in split)
{'2013-06-05T11:01:02.955': '', 'EVENT_TIME_UTC': '1370480141.000', 'FIRSTNAME': 'Jason', 'LASTNAME': 'Jone', 'REGION': 'UTAH', 'ACCESS_TYPE': 'Access Granted', 'PERSONNELID': 'salalm', 'QID': '231412', 'READER_NAME': 'CAZ.1 LOBBY LEFT TURNSTYLE OUT'}
Run Code Online (Sandbox Code Playgroud)

等等.正如他所说的那样,关键点在于,您显示的语法看起来很像最小的shell语法.OTOH,如果违反了你在其他地方展示过的模式,你可能会想回到编写自定义解析器.这种shlex方法适用时很方便,但并不像你想要的那样强大.