对正则表达式组求反

2024-06-01 09:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我把一个文件塞进了一根大绳子。我希望解析这个字符串并建立一个基于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

蒂亚

暗号战士


Tags: namereassemblypkgredcolorcompilecrunchy
2条回答

你可以用

regexJobB = re.compile(r'jobno:\s*(\d+)\s*(.*?)(?=\s+jobno:|$)', re.DOTALL)

参见regex demo。它将允许您获得单独的jobno,将它们的id捕获到组1中,并将其余的参数捕获到组2中。然后,您可以使用第二个regex来获取这些参数,或者只使用spliting。你知道吗

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:或字符串结尾。你知道吗

在这里使用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']

至少这样可以避免迭代。我的答案假设您有一个单行输入字符串。如果您需要跨行匹配,那么我的答案将略有变化。你知道吗

相关问题 更多 >