我把一个文件塞进了一根大绳子。我希望解析这个字符串并建立一个基于jobno的dict列表。每个作业的键/值对数量可变,没有特定的顺序。我唯一能指望的就是工号: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
蒂亚
暗号战士
你可以用
参见regex demo。它将允许您获得单独的
jobno
,将它们的id捕获到组1中,并将其余的参数捕获到组2中。然后,您可以使用第二个regex来获取这些参数,或者只使用spliting。你知道吗见Python demo:
输出:
正则表达式匹配
jobno:
-文本字符串\s*
-0+空格(\d+)
-第1组:一个或多个数字\s*
-0+空格(.*?)
-第2组:任何0个或更多字符,尽可能少(?=\s+jobno:|$)
-直到前1+个空格,后跟jobno:
或字符串结尾。你知道吗在这里使用
re.findall
似乎比您目前拥有的有所改进:至少这样可以避免迭代。我的答案假设您有一个单行输入字符串。如果您需要跨行匹配,那么我的答案将略有变化。你知道吗
相关问题 更多 >
编程相关推荐