import re
regex = re.compile(r"""
(*UTF16)
x (?<! \w x ) [\d._ –-]* (*SKIP) (*F)
|
order (?<! \w order ) [\W_]* (?:number)? [\W_]* [\d._ –-]* (*SKIP) (*F)
|
(?<res>
[1234578]
(?:[._ –-]{0,3}+\d){2}
(?: 0{2} [\d._ –-]* (*SKIP) (*F) )?
(?:[._ –-]{0,3}+\d){2}
)
(?: 0{4} [\d._ –-]* (*SKIP) (*F) )?
(?:[._ –-]{0,3}+\d){4}
|
(?<res>
0
(?: 0{2} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){2}
(?: 0{2} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){2}
)
(?: 0{4} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){4}
|
(?<res>
6
(?: 6{2} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){2}
(?: 0{2} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){2}
)
(?: 0{4} [\d._ –-]* (*SKIP) (*F) )?
(?: [._ –-]{0,3}+ \d ){4}
|
9 [\d._ –-]* (*SKIP) (*F)
""", flags=re.IGNORECASE | re.VERBOSE)
test_str = ("//won't match if it is preceded with 'X' or 'x'\n"
"x123456789\n"
"X123456789\n"
"x123-456-789\n"
"X123-456-789\n"
"123-456-789\n"
"ordernumber 123-456-789\n"
"order number123-456789\n"
"order number----123-456789\n"
"order number 123456789\n"
"ordernumber-x123456787\n"
"ordernumber-123456787\n"
"ORDERNUMBER-123456789\n"
"ordernumber - 123456789\n"
"ordernumber #123456789\n"
"ordernumber *%&%*123456789\n"
"ordernumber !@#$%^&123456789\n"
"order.number 123456789\n"
"order_number 123456789\n"
"order._.number 123456789\n"
"order...number#123456789\n"
"order-.-.-.-.123456789\n"
"order 123456789\n"
"order..123456789\n"
"order#123456789\n"
"order_#123456789\n"
"order._.#123456789\n"
"order___123456789\n"
"order#number 123456789\n"
"order......number 123456789\n"
"order.number.123456789\n"
"social security number 123-456-789\n"
"ordernumber !@#$%^&x123456789\n"
"123456789\n"
"#@%#$%#$123456789#$%#$^$#\n"
"123-456789\n"
"123456789\n"
"123456789\n"
"123 45 6789\n"
"123-45-6789\n"
"123-45-6789\n"
"123 – 45 – 6789\n"
"123.45.6789\n"
"123_45_6789\n"
"123 456 789\n"
"123-456-789\n"
"123 – 456 – 789\n"
"123.456.789\n"
"123_456_789\n"
"1234 56 789\n"
"1234-56-789\n"
"1234 – 56 – 789\n"
"1234.56.789\n"
"1234_56_789\n"
"12 345 6789\n"
"12-345-6789\n"
"12 – 345 – 6789\n"
"12.345.6789\n"
"12_345_6789\n\n"
"The number should not be matched at all for the following rules.\n\n"
"If the number beginning with the number “9”\n"
"912345678\n"
"912000000\n\n"
"If the number “666” in positions 1 – 3.\n"
"666000000\n"
"666450000\n"
"666129876\n\n"
"If the number “000” in positions 1 – 3.\n"
"000000000\n"
"000450000\n"
"000120000\n\n"
"If the number “00” in positions 4 – 5.\n"
"123006789\n"
"876001234\n"
"765003456\n\n"
"if the number “0000” in positions 6 – 9\n"
"123450000\n"
"123000000\n"
"876000000\n\n"
"x123456789\n"
"X123456789\n"
"x123-456-789\n"
"X123-456-789\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