如何用Python正则捕获BENCHMARK|Assigned间的多行数据?
需求与问题
已通过正则提取出包含CALL、CUSTOM-DATA及多组BENCHMARK记录的small_string,现需编写正则表达式,捕获以BENCHMARK|Assigned开头,至下一个BENCHMARK|Assigned或文本结尾的多行数据(每组包含对应单元的所有BENCHMARK记录)。但当前使用的正则仅能匹配单行的BENCHMARK|Assigned记录,无法跨行捕获完整的组数据,寻求解决方案。
提取small_string的代码
pattern = re.compile(r'CALL\|\d*\|.*\n*((?:\n.*)+?)(?=\nCALL|\Z)',re.MULTILINE) matches = pattern.finditer(text) list_dataframe = [] audit_data = [] counter = 0 for match in matches: while counter < 1: small_string = match.group(0) print(small_string) print('end small string \n') pattern1 = re.compile(r'BENCHMARK\|Assigned\|(?:.*)(?=BENCHMARK\|Assigned\||\Z)',re.MULTILINE) # assignments_iterator = pattern1.finditer(small_string)
small_string示例
CALL|2197040|77-MOTOR VEHICLE COLLISION|11/30/2022|18:22:31.0|28 ST S/I275-UNDER|439111.88686|1246532.42713|False||False|2022-11-30 18:21:24|| CUSTOM-DATA|2197040|1/1/0001 12:00:00 AM|1/1/0001 12:00:00 AM|1/1/0001 12:00:00 AM|1/1/0001 12:00:00 AM||SP3||||SP3|SP3|||||||0|0|0|0| BENCHMARK|Assigned|E10|0|2197040|Assigned||| BENCHMARK|TurnoutTime|E10|1.11666666666667|2197040|TurnoutTime|Engine-ALS|| BENCHMARK|OnScene|E10|1.11666666666667|2197040|OnScene||| BENCHMARK|UserDefCategory|E10|0|2197040|UserDefCategory|UnitType=R|| BENCHMARK|InService|E10|3.08333333333333|2197040|InService||| BENCHMARK|Assigned|E4|0|2197040|Assigned||| BENCHMARK|TurnoutTime|E4|0.733333333333333|2197040|TurnoutTime|Engine-ALS|| BENCHMARK|OnScene|E4|0.733333333333333|2197040|OnScene||| BENCHMARK|UserDefCategory|E4|0|2197040|UserDefCategory|UnitType=E|| BENCHMARK|InService|E4|4.43333333333333|2197040|InService||| BENCHMARK|Assigned|T1|0|2197040|Assigned||| BENCHMARK|TurnoutTime|T1|1.31666666666667|2197040|TurnoutTime|Truck|| BENCHMARK|OnScene|T1|7.93333333333333|2197040|OnScene||| BENCHMARK|UserDefCategory|T1|0|2197040|UserDefCategory|UnitType=T|| BENCHMARK|InService|T1|66.0333333333333|2197040|InService||| BENCHMARK|Assigned|R3|3.71666666666667|2197040|Assigned|||
期望捕获结果示例
# iter1 BENCHMARK|Assigned|E10|0|2197040|Assigned||| BENCHMARK|TurnoutTime|E10|1.11666666666667|2197040|TurnoutTime|Engine-ALS|| BENCHMARK|OnScene|E10|1.11666666666667|2197040|OnScene||| BENCHMARK|UserDefCategory|E10|0|2197040|UserDefCategory|UnitType=R|| BENCHMARK|InService|E10|3.08333333333333|2197040|InService|||
当前正则及问题
pattern1 = re.compile(r'BENCHMARK\|Assigned\|(?:.*)(?=BENCHMARK\|Assigned\||\Z)',re.MULTILINE) assignments_iterator = pattern1.finditer(small_string)
当前正则仅能匹配单行的BENCHMARK|Assigned记录,无法跨行捕获完整组,得到的结果如下:
BENCHMARK|Assigned|E10|0|2197040 BENCHMARK|Assigned|E4|0|2197040 BENCHMARK|Assigned|T1|0|2197040 BENCHMARK|Assigned|R3|3.71666666666667|2197040 BENCHMARK|Assigned|E3|3.73333333333333|2197040 BENCHMARK|Assigned|ME3|6|2197040
内容的提问来源于stack exchange,提问作者Sven D
相关产品推荐
相关产品推荐

