import re
regex = re.compile(r"=\s?.*(?:((?i)Fields\(\"(\w+)\"\)\.Value\)*?))", flags=re.MULTILINE)
test_str = ("Function lmpRoundedEndTime_ValueChanged(sender, e)\n"
"If CDbl(Fields(\"lmpShiftID\").Value) <> 0 And IsNull(Fields(\"lmpRoundedStartTime\").Value) = False And IsNull(Fields(\"lmpRoundedEndTime\").Value) = False Then\n"
" If CInt(App.Props(\"PN\").Fields(\"xapDCPayCalculationMethod\").Value) <> 2 Then\n"
" Fields(\"lmpPayrollHours\").Value = App.Ax(\"TimecardFunctions\").CalculateHours(Fields(\"lmpShiftID\").Value,Fields(\"lmpRoundedStartTime\").Value,Fields(\"lmpRoundedEndTime\").Value)\n"
"'''''''''''' ^ above should capture: lmpShiftID , lmpRoundedStartTime , lmpRoundedEndTime\n"
" End If\n"
"End If\n"
"End Function\n\n"
"Function TimecardLines_SetDefaultValues(sender, e)\n"
" Dim oRs,dTimecardDate\n"
" dTimecardDate = Null\n"
" Set oRs = CreateObject(\"ADODB.Recordset\")\n"
" oRs.Open \"select lmpEmployeeID,lmpShiftID,lmpTimecardDate,lmpProjectID from Timecards where lmpTimecardID = \" + App.Convert.NumberToSql(Fields(\"lmlTimecardID\").Value),Connection,adOpenStatic,adLockReadOnly,adCmdText\n"
" If oRs.EOF = False Then\n"
" Fields(\"lmlEmployeeID\").Value = oRs.Fields(\"lmpEmployeeID\").Value\n"
" Fields(\"lmlShiftID\").Value = oRs.Fields(\"lmpShiftID\").Value\n"
" Fields(\"lmlProjectID\").Value = oRs.Fields(\"lmpProjectID\").Value\n"
" dTimecardDate = oRs.Fields(\"lmpTimecardDate\").Value\n"
" End If\n"
" oRs.Close\n"
" \n"
" oRs.Open \"select top 1 lmlRoundedEndTime From TimecardLines Where lmlTimecardID = \" + App.Convert.NumberToSql(Fields(\"lmlTimecardID\").Value) + \" Order By lmlRoundedEndTime Desc\",Connection,adOpenStatic,adLockReadOnly,adCmdText\n"
" If oRs.EOF = False Then\n"
" Fields(\"lmlRoundedStartTime\").Value = oRs.Fields(\"lmlRoundedEndTime\").Value\n"
" Else\n"
" Fields(\"lmlRoundedStartTime\").Value = App.Ax(\"Shift\").GetDayStartTime(Fields(\"lmlShiftID\").Value, dTimecardDate, e.SqlTransaction)\n"
" ' Added to to fix -rounded end time is earlier than the rounded start time error when changing the labor hours\n"
" 'Fields(\"lmlRoundedEndTime\").Value=Fields(\"lmlRoundedStartTime\").Value \n"
" \n"
" End If\n"
" oRs.Close\n\n"
" If Trim(Fields(\"lmlEmployeeID\").Value) <> \"\" Then\n"
" oRs.Open \"select lmeDirectExpenseID,lmeIndirectExpenseID,lmeDefaultWorkCenterID from Employees where lmeEmployeeID = \" + App.Convert.StringToSql(Fields(\"lmlEmployeeID\").Value),Connection,adOpenStatic,adLockReadOnly,adCmdText\n"
" If oRs.EOF = False Then\n"
" If CInt(Fields(\"lmlTimecardType\").Value) = 1 Then\n"
" If Trim(oRs.Fields(\"lmeDirectExpenseID\").Value) <> \"\" Then\n"
" Fields(\"lmlExpenseID\").Value = oRs.Fields(\"lmeDirectExpenseID\").Value\n"
" End If\n"
" Else\n"
" If Trim(oRs.Fields(\"lmeIndirectExpenseID\").Value) <> \"\" Then\n"
" Fields(\"lmlExpenseID\").Value = oRs.Fields(\"lmeIndirectExpenseID\").Value\n"
" End If\n"
" End If\n"
" If CInt(Fields(\"lmlTimecardType\").Value) = 2 Then\n"
" If Trim(oRs.FIelds(\"lmeDefaultWorkCenterID\").Value) <> \"\" Then\n"
" Fields(\"lmlWorkCenterID\").Value = oRs.FIelds(\"lmeDefaultWorkCenterID\").Value\n"
" End If\n"
" End If\n"
" End If\n"
" oRs.Close\n"
" End If\n"
"End Function")
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