import re
regex = re.compile(r"EXP.*\n(?P<data1>[0-9]+)\n(?P<data2>[0-9]+)\n(?P<data3>[0-9]+)\n(?P<gname>[A-z_0-9]+)\n(?P<gcode>[A-Z]+)\n(?P<gvers>[0-9]+)\n(?P<app_desc>[A-z0-9 ]+)\n(?P<run_desc>[A-z0-9 ]+)\n(?P<last_mod>[A-z0-9: ]+)\n(?P<data4>.*)\n(?P<parent>.*\.(?:APP|app))\n(?P<script>.*\.(?:APP|app))\n(?P<app_type>[A-Z]+)\n(?P<app_vpr>.*\.(?:VPR|vpr))\n", flags=re.MULTILINE)
test_str = ("&PROJFIL\n"
"EXP0 3 0Node File {CATALOG_DIR}\\99_temp\\initial_nodes.dbf \n"
"EXP1 1 0Matrix File 1 {CATALOG_DIR}\\99_temp\\Y{year}_initial_skims.mat \n"
"EXP1 220Network File {CATALOG_DIR}\\99_temp\\initial_highway_loaded.net \n"
"EXP2 1 0Network File {CATALOG_DIR}\\99_temp\\checked_pt_network.net \n"
"EXP2 7 0NTLegs File {SCENARIO_DIR}\\Y{year}_{NetName}_nt_legs.ntl \n"
"EXP2 130Route File 1 {CATALOG_DIR}\\99_temp\\initial_PT_skims.rte \n"
"EXP2 230Matrix File 1 {CATALOG_DIR}\\\\99_temp\\initial_PT_costs.mat \n"
"EXP3 1 0Network File {SCENARIO_DIR}\\Y{year}_unloaded_network.net \n"
"EXP5 210Record File 1 {CATALOG_DIR}\\99_temp\\vc_factors.dbf \n"
"EXP5 220Record File 2 {CATALOG_DIR}\\99_temp\\sector_factors.dbf \n"
"EXP6 1 0Matrix File 1 {SCENARIO_DIR}\\Y{year}_{FareScen}_RFARES.mat \n"
"EXP7 4 0Print Data 1 {SCENARIO_DIR}\\Y{YEAR}_initial_network_costs_summary.dat \n"
"11\n"
"0\n"
"0\n"
"Network_Builder\n"
"NB\n"
"00\n"
"Network Builder\n"
"Building The Network\n"
"Thu Sep 04 20:35:34 2025\n\n"
"D:\\Projects\\20240510_Manila_STM\\Manila_STM\\Manila00.app\n"
"D:\\PROJECTS\\20240510_MANILA_STM\\MANILA_STM\\10_NETWORK_BUILDER\\NETWOR00.APP\n"
"VOYAGER\n"
"D:\\Projects\\20240510_Manila_STM\\Manila_STM\\DEFAULT.VPR\n\n"
"1\n"
"Network Building\n"
"29,-8,0,0,Calibri,48,700,0,0,5066061\n"
"2\n"
"TODO: - Add Nodes and Centroids and Centroid Connectors (can be dummy initially) - DONE - Add capability of adding Schemes - DONE - Build Test Highway Assignment for unit Matrix - DONE - check unconnected zones - DONE - Build PT Files (Factors, line, NT Legs, etc) - Working Now, but nee\n"
"d to renumber the network... - Perform initial Skims for first assignment - DONE\n"
"2441,-1563,0,0,Calibri,14,400,0,0,255\n"
"&End_TextAnnotation\n\n"
"{ZoneVersion,ComboList-CHARACTER,\"Zone Version for TAZ\",\"BASE\", ,\"BASE\",\"250506\"}\n"
"{Network Schemes,EditBox-CHARACTER,\"Network Schemes\",\"schemes_v0.csv\"}\n")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html