用于提取多个模式的正则表达式

时间:2018-09-03 08:20:30

标签: python regex pandas

我有这样的字符串

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: #########')

2 个答案:

答案 0 :(得分:2)

您可以通过以下解决方案来实现所需的目标:

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?$是必需的,因为在多行模式下,$仅在换行符之前匹配,而在不匹配时将第1组的值添加到临时列表中,然后用], [拆分第二组的内容(如果不确定空格的数量,则可以使用re.split(r']\s*,\s*\[', m.group(2)) ),然后仅将其中包含:的那些项添加到临时列表中。

答案 1 :(得分:0)

由于使用“捕获”正则表达式,每个结果将获得三个元素。像这样重写您的正则表达式以结合第二个和第三个匹配项:

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

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