【问题标题】:Extract Entire String Right of the Delimiter from a multi-line string after a match匹配后从多行字符串中提取分隔符的整个字符串右侧
【发布时间】:2019-02-26 13:52:20
【问题描述】:

从多行字符串中,我试图在匹配后提取= 符号右侧的整个字符串。但是,仅提取字符串的一部分。 我该如何解决这个问题?我也对其他实现搜索/提取操作持开放态度。

import re
s = '''jaguar.vintage.aircards = 2
jaguar.vintage.hw.sdb.size = 512.1 GB
jaguar.vintage.hw.tm.firmware = SWI9X15C_05.05.16.02 r21040 carmd-fwbuild1 2014/03/17 23:49:48
jaguar.vintage.hw.tm.hardware = 1.0
jaguar.vintage.hw.tm.iccid = 8901260591783960689
jaguar.vintage.hw.tm.imei = 359225051166726
jaguar.vintage.hw.tm.imsi = 310260598396068
jaguar.vintage.hw.tm.model = MC7354
jaguar.vintage.hw.wifi1.mac = 00:30:1a:4e:06:7a
jaguar.vintage.hw.wifi2.mac = 00:30:1a:4e:06:79
jaguar.vintage.part = P34110-002
jaguar.vintage.product = P34101
jaguar.vintage.psoc = 0.1.16
jaguar.vintage.serial = 34110002T0021
jaguar.vintage.slavepsoc1 = 0.1.5
jaguar.vintage.sw.app.release = 4.0.0.41387-201902131138git367fbda8e
'''
# print(s)
# release = (s.split('jaguar.vintage.sw.app.release =')[1]).strip()
# print(release)
#part_number = jaguar.vintage.part = P34110-002
pnumsrch = r"jaguar.vintage.part =.*?(?=\w)(\w+)"
part_number = re.findall(pnumsrch, s)
print(part_number[0])

# release_number = jaguar.vintage.sw.app.release = 4.0.0.41387-201902131138git367fbda8e
relnumsrch = r"jaguar.vintage.sw.app.release =.*?(?=\w)(\w+)"
rel_number = re.findall(relnumsrch, s)
print(rel_number[0])

实际:
P34110
4

预期:
P34110-002
4.0.0.41387-201902131138git367fbda8e

【问题讨论】:

  • 使用pnumsrch = r"jaguar\.vintage\.part\s*=\s*(.*)",然后使用relnumsrch = r"jaguar\.vintage\.sw\.app\.release\s*=\s*(.*)"

标签: python regex string


【解决方案1】:

由于. 默认不匹配换行符,您可以简单地使用.* 匹配行的其余部分:

pnumsrch = r"jaguar.vintage.part = (.*)"

和:

relnumsrch = r"jaguar.vintage.sw.app.release = (.*)"

【讨论】:

  • 如何修改relnumsrch = r"jaguar.vintage.sw.app.release = (.*)" 以提取从4.0.0.41387-201902131138git367fbda8e 到- 的所有字符?
  • @RSSregex 你可以改用relnumsrch = r"jaguar.vintage.sw.app.release = (.*)-"
  • @RSSregex 顺便问一下,您能否将您认为最有帮助的答案标记为已接受? (点击答案旁边的灰色复选标记。)
【解决方案2】:

抓住所有不是新行的东西Demo

pat = re.compile(r'jaguar\.vintage\.part = ([^\n]+)')
pat2 = re.compile(r'jaguar\.vintage\.sw\.app\.release = ([^\n]+)')

>>> pat.findall(s)

['P34110-002']
>>> pat2.findall(s)

['4.0.0.41387-201902131138git367fbda8e']

你也应该在你的模式中避开你的时期。

正如@WiktorStribiżew 所述,just . is good enough for the [^\n] portion

pat = re.compile(r'jaguar\.vintage\.part = (.+)')
pat2 = re.compile(r'jaguar\.vintage\.sw\.app\.release = (.+)')

【讨论】:

  • 请注意[^\n] = .
  • pat 返回jaguar.vintage.part = P34110-002。我需要捕获=符号右侧的字符串。
  • 谢谢@WiktorStribiżew,我想单行. 就足够了:)
猜你喜欢
  • 2019-02-28
  • 1970-01-01
  • 2019-02-28
  • 2017-05-26
  • 1970-01-01
  • 2019-03-14
  • 2012-05-20
  • 2018-02-05
  • 2017-12-14
相关资源
最近更新 更多