多模式提取的正则表达式

2024-06-11 05:42:31 发布

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

我有这样的绳子

string="""Claim Status\r\n[Primary Status: Paidup to Rebilled]\r\nGeneral Info.\r\n[PA Number: #######]\r\nClaim Insurance: Modified\r\n[Ins. Mode: Primary], [Corrected Claim Checked], [ICN: #######], [Id: ########]"""

tokens=re.findall('(.*)\r\n(.*?:)(.*?])',string)

输出

 ('Claim Status', '[Primary Status:', ' Paidup to Rebilled]')
 ('General Info.', '[PA Number:', ' R180126187]')
 ('Claim Insurance: Modified', '[Ins. Mode:', ' Primary]')

想要的输出:

 ('Claim Status', 'Primary Status:Paidup to Rebilled')
 ('General Info.', 'PA Number:R180126187')
 ('Claim Insurance: Modified', 'Ins. Mode:Primary','ICN: ########', 'Id: #########')

Tags: toinfonumberstringmodestatusmodifiedinsurance
2条回答

每个结果有三个元素,因为您使用的是“捕获”正则表达式。像这样重写regexp以合并第二个和第三个匹配项:

re.findall('(.*)\r\n((?:.*?:)(?:.*?]))',string)

(?:...)(而不是(...))分隔的组是“非捕获”的,即它不算作\1等的匹配目标,也不会被re.findall看到。我已经使你的两个组都不捕获,并在它们周围添加了一个捕获(常规)组。你知道吗

您可以使用以下解决方案来实现所需:

import re
s="""Claim Status\r\n[Primary Status: Paidup to Rebilled]\r\nGeneral Info.\r\n[PA Number: #######]\r\nClaim Insurance: Modified\r\n[Ins. Mode: Primary], [Corrected Claim Checked], [ICN: #######], [Id: ########]"""
res = []
for m in re.finditer(r'^(.+)(?:\r?\n\s*\[(.+)])?\r?$', s, re.M):
    t = []
    t.append(m.group(1).strip())
    if m.group(2):
        t.extend([x.strip() for x in m.group(2).strip().split('], [') if ':' in x])
    res.append(tuple(t))
print(res)

参见Python online demo。输出:

[('Claim Status', 'Primary Status: Paidup to Rebilled'), ('General Info.', 'PA Number: #######'), ('Claim Insurance: Modified', 'Ins. Mode: Primary', 'ICN: #######', 'Id: ########')]

使用^(.+)(?:\r?\n\s*\[(.+)])?\r?$正则表达式,匹配两个连续的行,其中第二行是可选的(由于(?:...)?可选的非捕获组),第一行被捕获到组1中,随后的一行(以[开始,以]结束)被捕获到组2中。(请注意,\r?$是必需的,因为在多行模式下,$只在换行符之前匹配,而不是回车符。)Group 1值被添加到临时列表中,然后第二个组的内容被], [分割(如果您不确定空格的数量,您可以使用re.split(r']\s*,\s*\[', m.group(2))),然后只将其中包含:的项添加到临时列表中。你知道吗

相关问题 更多 >