为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2021-06-04 14:33:17
我有这样的字符串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 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

您可以通过以下解决方案实现您的需求:


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 在线演示。输出:


[('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 的项目添加:到临时列表中。


查看完整回答
反对 回复 2021-06-09
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号