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

我有这样的字符串


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


长风秋雁
浏览 165回答 2
2回答

噜噜哒

您可以通过以下解决方案实现您的需求:import res="""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 在线演示。输出:[('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))) 然后只将那些包含 a 的项目添加:到临时列表中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python