我已将文件插入一个大字符串中。我希望解析该字符串,并基于jobno建立字典列表。每个作业将具有可变数量的键/值对,并且没有特定的顺序。我唯一可以指望的是jobno:xxxx对,始终表示新工作的开始
python 2.7
import re
bigstr = "jobno: 4859305 jobtype: ASSEMBLY name: BLUEBALLOON color: red jobno: 3995433 name: SNEAKYPETE jobtype: PKG texture: crunchy"
regexJobA = re.compile(r'((\w+):\s(\w+)\s?)', re.DOTALL)
for mo in regexJobA.finditer( bigstr):
keyy, valu = mo.groups():
print keyy + ":" + valu
收益
jobno:4859305
jobtype:ASSEMBLY
name:BLUEBALLOON
color:red
jobno:3995433
jobtype:PKG
texture:crunchy
我可以用锤子/文件/沙子/油漆来工作。但是必须有一个更优雅的正则表达式可以隐式地建立工作,例如
regexJobB = re.compile(r'((jobno):\s(\w+)\s?)((*not_jobno*):\s(\w+)\s?)+', re.DOTALL)
可以解决问题。但是如何否定(jobno)小组?或使用一些先行/后向/环顾四周的聪明态度
jobno:4859305 jobtype:ASSEMBLY name:BLUEBALLOON color:red
jobno:3995433 jobtype:PKG texture:crunchy
TIA,
code_warrior
答案 0 :(得分:0)
在这里使用re.findall
似乎比您目前拥有的东西有所改进:
bigstr = "jobno: 4859305 jobtype: ASSEMBLY name: BLUEBALLOON color: red jobno: 3995433 name: SNEAKYPETE jobtype: PKG texture: crunchy"
result = re.findall('\S+\s*:\s*\S+', bigstr)
print(result)
['jobno: 4859305', 'jobtype: ASSEMBLY', 'name: BLUEBALLOON', 'color: red', 'jobno: 3995433',
'name: SNEAKYPETE', 'jobtype: PKG', 'texture: crunchy']
至少这避免了迭代。我的答案假设您有一个单行输入字符串。如果您需要跨行匹配,那么我的答案会稍有变化。
答案 1 :(得分:0)
您可以使用
regexJobB = re.compile(r'jobno:\s*(\d+)\s*(.*?)(?=\s+jobno:|$)', re.DOTALL)
请参见regex demo。它将使您获得单独的jobno
,将其ID捕获到组1中并将其余参数捕获到组2中。然后,您可以使用第二个正则表达式来获取这些参数,或者仅使用拆分。>
查看Python demo:
import re
bigstr = "jobno: 4859305 jobtype: ASSEMBLY name: BLUEBALLOON color: red jobno: 3995433 name: SNEAKYPETE jobtype: PKG texture: crunchy"
regexJobB = re.compile(r'jobno:\s*(\d+)\s*(.*?)(?=\s+jobno:|$)', re.DOTALL)
for job in regexJobB.finditer(bigstr):
jobno = job.group(1)
jobparams = dict(re.findall(r'(\w+):\s*(\w+)', job.group(2)))
print("No.: {}\nOther params: {}".format(jobno, jobparams))
输出:
No.: 4859305
Other params: {'color': 'red', 'name': 'BLUEBALLOON', 'jobtype': 'ASSEMBLY'}
No.: 3995433
Other params: {'texture': 'crunchy', 'name': 'SNEAKYPETE', 'jobtype': 'PKG'}
正则表达式匹配
jobno:
-文字字符串\s*
-超过0个空格(\d+)
-第1组:一个或多个数字\s*
-0 +空格(.*?)
-第2组:尽可能少包含0个或多个字符(?=\s+jobno:|$)
-最多前1个空格,后跟jobno:
或字符串结尾。