否定正则表达式组

时间:2019-01-07 05:11:04

标签: python regex

我已将文件插入一个大字符串中。我希望解析该字符串,并基于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

2 个答案:

答案 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:或字符串结尾。