import re
regex = re.compile(r"^([A-Z](([A-Z]{1,2}[a-z0-9]+)+([A-Z]{1,3}[a-z0-9]+)*[A-Z]{0,3}|([a-z0-9]+[A-Z]{0,3})*|[A-Z]{1,2}))$|^([a-z][a-z0-9]*(([A-Z]{1,3}[a-z0-9]+)*[A-Z]{0,3}|([a-z0-9]+[A-Z]{1,3})*|[A-Z]{1,3}))$", flags=re.MULTILINE)
test_str = ("ABCD\n"
"ABCDE\n"
"MdeADFAFdsADFads\n"
"DeviceSNSD\n"
"AabcABCD\n"
"ABabcABCD\n"
"ABabcABCDabcABCD\n"
"ABCabcABCD\n"
"ABCabcABCDabcABCDabcABCDabcABCD\n"
"ABCDabcABCD\n"
"ABCDabcABCDabcABCDabcABCDabcABCD\n"
"HTMLParser\n"
"ContextHTMLParser\n"
"ABCDabcABC\n"
"ABCDabcAB\n"
"ABCDabcA\n"
"CamelCa_1\n"
"HELLO\n"
"snake_case\n"
"2PascalCase\n"
"streamIOIO\n"
"gREATERDtha\n"
"modeADFAFdsADFads\n"
"camelCa_1\n"
"contextHTMLParser\n"
"hELLO\n"
"AabcABCDabcABC\n"
"AabcABCDabcABCD\n"
"AabcABCabcABCD\n"
"ABabcABCDabcABC\n"
"ABabcABCDabcABCD\n"
"ABabcABCabcABCD\n"
"aBabcABCDabcABC\n"
"aBabcABCDabcABCD\n"
"aBabcABCabcABCD\n"
"ababcABCDabcABC\n"
"ababcABCDabcABCD\n"
"ababcABCabcABCD\n"
"SerialNO\n"
"serialNo\n"
"context\n"
"camelCasE\n"
"aGa\n"
"alphabet\n"
"serialNO\n"
"modeADFdsADFads\n"
"streamIO\n"
"aBCabcABCabcA\n"
"aBCabcA\n"
"aabc123\n"
"aabcABC\n"
"ab\n"
"abc\n"
"abcd\n"
"abcde\n"
"deviceSNS\n"
"pathASNs\n"
"dscpCP\n"
"awsVPC\n"
"deviceID\n"
"camelCasecamelCasecamelCasecamelCasecamelCasecamelCase\n"
"gREA1\n"
"gREAt\n"
"gREAtREAt\n"
"cP3\n"
"a1\n"
"aABC\n"
"a123\n"
"modeADFsADFads\n"
"a1G\n"
"aG\n"
"a\n"
"modeADFads\n"
"camelCase\n"
"lThan30DaysCount\n"
"lessThan30DaysCount\n"
"lessThan30DaysCountA\n"
"greaterThan30LessThan60DaysCount\n"
"greaterThan60LessThan90DaysCount\n"
"greaterThan90DaysCount\n"
"pascalCase\n"
"pascal2Case\n"
"pascalCaseA\n"
"pascal2CaseA\n"
"modeA\n"
"mode2A\n"
"mode2A2\n"
"mode2A2A\n"
"createAMode\n"
"createBMode\n"
"madeEasy\n"
"wonderFul\n"
"andMe\n"
"htmlParser\n"
"h\n"
"aaA\n"
"camel01C\n"
"camel01c01\n"
"camel01C01\n"
"camel01CC01\n"
"camel0a1c1\n"
"camel0a1C1\n"
"camel0ac1b1C1\n"
"camelC\n"
"camelC1\n"
"camelCA\n"
"camelCa1\n"
"ibsReleaseTestVerificationRegressionSuite\n"
"ibsReleaseTestVerificationRegressioNSuite\n"
"ibsReleaseTestVerificationRegressioN\n"
"xmlHttpRequest\n"
"newCustomerId\n"
"innerStopwatch\n"
"supportsIpv6OnIos\n"
"youTubeImporter\n"
"youtubeImporter\n"
"affine3D\n"
"Ag\n"
"ABCabcABCabc\n"
"AwsVPC\n"
"AaABC\n"
"PacalCasePacalCasePacalCasePacalCasePacalCasePacalCase\n"
"AabcABCabcABC\n"
"MoeADFdsADFads\n"
"ABCabcABC\n"
"ABCabcAB\n"
"ABabcABC\n"
"ABabcAB\n"
"AabcAB\n"
"ABCabcABCabcA\n"
"ABCabcA\n"
"Aabc123\n"
"AabcABC\n"
"A\n"
"AB\n"
"ABC\n"
"StreamIO\n"
"IOStream\n"
"DeviceID\n"
"DeviceSNS\n"
"Context\n"
"PascalCase\n"
"Pascal2Case\n"
"PascalCaseA\n"
"Pascal2CaseA\n"
"ModeA\n"
"Mode2A\n"
"Mode2A2\n"
"Mode2A2A\n"
"CreateAMode\n"
"CreateBMode\n"
"MadeEasy\n"
"WonderFul\n"
"AndMe\n"
"HtmlParser\n"
"H\n"
"AaA\n"
"Camel01C\n"
"Camel01c01\n"
"Camel01C01\n"
"Camel01CC01\n"
"Camel0a1c1\n"
"Camel0a1C1\n"
"Camel0ac1b1C1\n"
"CamelC\n"
"CamelC1\n"
"CamelCA\n"
"CamelCa1\n"
"IbsReleaseTestVerificationRegressionSuite\n"
"IbsReleaseTestVerificationRegressioNSuite\n"
"IbsReleaseTestVerificationRegressioN\n"
"XmlHttpRequest\n"
"NewCustomerId\n"
"InnerStopwatch\n"
"SupportsIpv6OnIos\n"
"YouTubeImporter\n"
"YoutubeImporter\n"
"Affine3D")
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