import re
regex = re.compile(r"^(?:(52\-)|(1\-))?(\()?(?(1)[0-9]{2,3}|[2-9][0-9]{2})(?(3)\)\s?|(\-|[.]|\s|))(?(1)[0-9]|[2-9])[0-9]{2}(?(4)\4|(?:\-|[.]|\s)?)[0-9]{4}(\s?(?:x|ext|ext.|extension|Ext|Ext.|Extension|#)\s?[0-9]+)?$", flags=re.MULTILINE)
test_str = ("Regular valid formats\n\n"
"225-586-7777\n"
"(223)249-4444\n"
"(223) 234-3344\n"
"223.456.2222\n"
"2253451111\n"
"223 334 4444\n\n"
"1-325-586-7777\n"
"1-(923)249-4444\n"
"1-(923) 234-3344\n"
"1-923.456.2222\n"
"1-9253451111\n"
"1-923 234 4444\n\n"
"52-125-586-7777\n"
"52-(123)249-4444\n"
"52-(123) 234-3344\n"
"52-123.456.2222\n"
"52-1253451111\n"
"52-123 134 4444\n\n"
"Valid formats with extensions\n\n"
"1-800-661-3696 x14700\n"
"1-800-661-3696x14700\n"
"1-800-661-3696 Extension 14700\n"
"1-800-661-3696 ext14700\n\n"
"325-586-7777 x123\n"
"(323)249-4444x123\n"
"(323) 234-3344 Ext 123\n"
"323.456.2222 ext 124\n"
"3253451111ext. 123\n"
"323 334 4444extension234\n"
"(223)456 7891 x 123\n"
"(223)456 7891 ext 123\n"
"(223)456 7891 ext. 123\n"
"(223)456 7891 Ext 123\n"
"(223)456 7891 Ext. 123\n"
"(910)456-8970 x12\n"
"(910)456-8970 #12\n"
"(910)456-8970 extension12456\n"
"(910)456-8970 Extension 12456\n\n"
"Invalid formats\n\n"
"444000-1111\n"
"444-0001111\n"
"444.000-1111\n"
"444000 1111\n"
"444 0001111\n"
"444 000.1111\n"
"444.0001111\n"
"444000.1111\n"
"444-000.1111\n"
"(4440001111\n"
"444)0001111\n"
"440001111\n"
"444000111111\n\n"
"125-586-7777\n"
"(123)249-4444\n"
"(123) 234-3344\n"
"123.456.2222\n"
"1253451111\n"
"123 134 4444\n\n"
"125-586-7777\n"
"(123)249-4444\n"
"(123) 234-3344\n"
"123.456.2222\n"
"1253451111\n"
"123 134 4444\n\n"
"Invalid formats with extensions\n\n"
"12-125-586-7777\n"
"12-(123)249-4444\n"
"12-(123) 234-3344\n"
"12-123.456.2222\n"
"12-1253451111\n"
"12-123 134 4444\n\n"
"12-444000-1111\n"
"12-444-0001111\n"
"12-444.000-1111\n"
"12-444000 1111\n"
"12-444 0001111\n"
"12-444 000.1111\n"
"12-444.0001111\n"
"12-444000.1111\n"
"12-444-000.1111\n"
"12-(4440001111\n"
"12-444)0001111\n"
"12-440001111\n"
"12-444000111111\n\n"
"1-888-720-1275 x2 x2\n"
"1-888-720-1275 2\n"
"1-888-720-1275 x\n"
"1-888-720-1275 Ext\n"
"888-720-1275x\n\n"
"1-444000-1111\n"
"1-444-0001111\n"
"1-444.000-1111\n"
"1-444000 1111\n"
"1-444 0001111\n"
"1-444 000.1111\n"
"1-444.0001111\n"
"1-444000.1111\n"
"1-444-000.1111\n"
"1-(4440001111\n"
"1-444)0001111\n"
"1-440001111\n"
"1-444000111111")
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