import re
regex = re.compile(r"((8|\+7?)[\- ]?)?(\(?\d{3}\)?[\- ]?)?([\d\- ]{7,10})")
test_str = ("======== local phone\n\n"
"765-43-21\n"
"7654321\n"
"765-4321\n\n"
"======== operator phone\n\n"
"(921) 765-43-21\n"
"(921) 7654321\n"
"(921) 765-4321\n\n"
"(921)765-43-21\n"
"(921)7654321\n"
"(921)765-4321\n\n"
"921765-43-21\n"
"9217654321\n"
"921765-4321\n\n"
"921-765-43-21\n"
"921-7654321\n"
"921-765-4321\n\n"
"======== world phone\n\n"
"+7 (921) 765-43-21\n"
"+7(921) 765-43-21\n"
"+7-(921) 765-43-21\n"
"7 (921) 765-43-21\n"
"7(921) 765-43-21\n"
"8 (921) 765-43-21\n"
"8(921) 765-43-21\n"
"8-(921) 765-43-21\n"
"8 (921) 765-43-21\n"
"8(921) 765-43-21\n"
"8-(921) 765-43-21\n\n"
"+7 9217654321\n"
"+79217654321\n"
"+7-9217654321\n"
"7 9217654321\n"
"79217654321\n"
"7-9217654321\n"
"8 9217654321\n"
"89217654321\n"
"8-9217654321\n"
"8 9217654321\n"
"89217654321\n"
"8-9217654321\n\n"
"======== not found \n\n"
">>>>>>>>> 1. Коржев Артём Борисович 8-921-641-82-15;\n\n"
"======== bad\n\n\n"
"0 0 0 0\n"
"333 000\n"
"1 1 1205 1320 321\n\n\n"
"======== разбор\n\n"
" # world phone\n"
" (\n"
" (8|\\+?7)\n"
" [\\- ]?\n"
" )?\n\n"
" # operator phone\n"
" (\n"
" \\(?\n"
" \\d{3}\n"
" \\)?\n"
" [\\- ]?\n"
" )?\n\n"
" # local phone\n"
" [\\d\\- ]{7,10}")
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