我有这样的字符串
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: #########')
答案 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
“看到”。我已使您的两个小组都无法捕获,并在它们周围添加了一个捕获(常规)组。