Python-在正则表达式中创建多个可选组
我有两个字符串,其中字符串的某些部分是可选的。因此,我尝试在每个我想设置为可选的组之后使用Python-在正则表达式中创建多个可选组,python,regex,Python,Regex,我有两个字符串,其中字符串的某些部分是可选的。因此,我尝试在每个我想设置为可选的组之后使用?创建可选模式。但是,它将None作为这些组的输出 Text-1: text1 = '95031B2\tR\tC01 N1 P93 R-- 12:39:18.540 08/05/20 0000002802 R - No_barcode FLC F LR 7.673353 sccm Pt 25.288202 psig FL
?
创建可选模式。但是,它将None
作为这些组的输出
Text-1:
text1 = '95031B2\tR\tC01 N1 P93 R-- 12:39:18.540 08/05/20 0000002802 R - No_barcode FLC F LR 7.673353 sccm Pt 25.288202 psig FL 536.651917 sccm EDC 0.000000 sccm PQ 7.668324 sccm QF 536.289246 sccm QP 25.287605 psig LLQ -0.109524 sccm HLQ 4.440174 sccm CLF 1.429953 sccm MF 0.000000 sccm LF 100.000015 sccm MQF 0.000000 sccm LQF 100.000015 sccm FPR 25.290846 psig \r\n'
text2 = '5102060\tR\tC01 N1 P93 R-- 12:38:52.140 08/05/20 0000002801 FO - No_barcode \r\n'
>>> res = re.search(r''.join(pattern1), text) # pattern1
>>> res.groups()
('12:39:18.540', '08/05/20', '0000002802', 'R', 'No_barcode', 'FLC', 'Pt 25.288202 psig', 'FL 536.651917 sccm')
Text-2:
text1 = '95031B2\tR\tC01 N1 P93 R-- 12:39:18.540 08/05/20 0000002802 R - No_barcode FLC F LR 7.673353 sccm Pt 25.288202 psig FL 536.651917 sccm EDC 0.000000 sccm PQ 7.668324 sccm QF 536.289246 sccm QP 25.287605 psig LLQ -0.109524 sccm HLQ 4.440174 sccm CLF 1.429953 sccm MF 0.000000 sccm LF 100.000015 sccm MQF 0.000000 sccm LQF 100.000015 sccm FPR 25.290846 psig \r\n'
text2 = '5102060\tR\tC01 N1 P93 R-- 12:38:52.140 08/05/20 0000002801 FO - No_barcode \r\n'
>>> res = re.search(r''.join(pattern1), text) # pattern1
>>> res.groups()
('12:39:18.540', '08/05/20', '0000002802', 'R', 'No_barcode', 'FLC', 'Pt 25.288202 psig', 'FL 536.651917 sccm')
text1的工作模式:
预期输出:
text1 = '95031B2\tR\tC01 N1 P93 R-- 12:39:18.540 08/05/20 0000002802 R - No_barcode FLC F LR 7.673353 sccm Pt 25.288202 psig FL 536.651917 sccm EDC 0.000000 sccm PQ 7.668324 sccm QF 536.289246 sccm QP 25.287605 psig LLQ -0.109524 sccm HLQ 4.440174 sccm CLF 1.429953 sccm MF 0.000000 sccm LF 100.000015 sccm MQF 0.000000 sccm LQF 100.000015 sccm FPR 25.290846 psig \r\n'
text2 = '5102060\tR\tC01 N1 P93 R-- 12:38:52.140 08/05/20 0000002801 FO - No_barcode \r\n'
>>> res = re.search(r''.join(pattern1), text) # pattern1
>>> res.groups()
('12:39:18.540', '08/05/20', '0000002802', 'R', 'No_barcode', 'FLC', 'Pt 25.288202 psig', 'FL 536.651917 sccm')
对于pattern2(在向pattern1添加可选部分之后),我应该获得与pattern1相同的输出
>>> res = re.search(r''.join(pattern2), text) # pattern2
>>> res.groups()
('12:39:18.540', '08/05/20', '0000002802', 'R', 'No_barcode', 'FLC', 'Pt 25.288202 psig', 'FL 536.651917 sccm')
您使用可选组将所有零件包装在强制性零件之后,并在模式中的每一行之间插入了
交替运算符,这是创建可选组的错误方法
如果这些部分都是可选的,并且后续子模式不依赖于是否找到前面的子模式,则需要使用可选组包装每个部分:(?:…(可选的_1)…)?(?:…(可选的_2)…)(?:…(可选的_n)…?
或者,如果前面的子模式缺失,则无法显示每个后续模式,则创建嵌套的可选组:(?:…(可选)1).(?:…(可选)2).(?:…(可选)…)?)(
因此,您可以使用:
(P\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d(P P\P\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\s(P(P P\d\d\d\d\d\d\d\d\d)两两两两个可能可能会(P\扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑扑??
或:
(P\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\s(P\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\s(P(P P P\d\d\d\d\10)的人士(P(P\P\d\d\d\d\d\d\d)可能可能会或或P\P\P\d\d\P\d\d\d\d(P\P\d\d\d\d\d\d\d)的任何人士(P(P\d\d\)?
既然你说你需要方案1,你可以使用
pattern = [r'(?P<time>\d\d:\d\d:\d\d.\d{3})\s',
r'(?P<date>\d\d/\d\d/\d\d)\s',
r'(?P<sno>\d{10})\s',
r'(?P<status>\w{1,2}).*?-',
r'\s*',
r'(?P<bcode>No_barcode|\W{20})',
r'(?:\s+', # (?: starts a non-capturing group...
r'(?P<type>\w{3}))?', # ...)? closes the group,
r'(?:.*?',
r'(?P<pr>Pt.*?\d*[.]?\d*\s[a-z]+))?'
r'(?:\s{1,3}',
r'(?P<fl>FL.*?\d*[.]?\d*\s[a-z]+))?'
]
print(r''.join(pattern))
pattern=[r'(?P\d\d:\d\d:\d\d\d{3})\s',
r'(?P\d\d/\d\d/\d\d)\s',
r'(?P\d{10})\s',
r'(?P\w{1,2})。*?-',
r'\s*',
r'(?PNo_条码|\W{20}),
r'(?:\s+),#(?:启动非捕获组。。。
r'(?P\w{3}))?',#…)关闭组,
r'(?:*?),
r'(?PPt.*?\d*[.]?\d*\s[a-z]+)?'
r'(?:\s{1,3}',
r'(?PFL.*?\d*[.]?\d*\s[a-z]+)?'
]
打印(r“”。连接(图案))
请参见。您可以指定您的目标是什么以及您期望作为输出的内容吗?@tomanizer我添加了相关的预期输出详细信息。您使用可选组将所有零件包装在强制性零件之后,并在模式中的每一行之间插入了
交替运算符,这是错误的。如果所有零件都是可选的,则需要使用可选组包装每个零件。谢谢。我在模式2中没有看到任何FL,Pt。为什么您希望它显示在正则表达式中?您没有正确创建可选组。此外,您应该指定后续子模式是否匹配取决于是否找到前面的子模式。请告诉我您需要实现哪个可选方案,我将添加Python代码。我想使用第一个正则表达式,不需要嵌套的可选组,但感谢分享。这很有帮助@shaikmoeed I添加了Scheme 1模式定义。顺便说一下,我建议使用原始字符串文字来避免反斜杠的任何问题。我不理解在每个可选组中使用非捕获组的目的。不仅是关于这个例子,我还读过其他的例子。你能用这个例子解释一下吗?@shaikmoeed非捕获组被用作一系列模式的容器,而不将匹配存储在单独的内存插槽中。因为您只依赖于命名组,所以可以使用捕获组,但使用非捕获组会更整洁。另外,请参见。