import re
regex = re.compile(r"""
^
# 40-character hex values are okay
(0x[a-fA-F\d]{40}(*ACCEPT)
# 'D' or 'X' followed by 33 specific characters are okay
|D[^0-4\W_IOV-Z][^\W_IOl0]{32}(*ACCEPT)
|X[^\W_IOl0]{33}(*ACCEPT)
# 'bc1' followed by a range of specific characters are okay
|bc1[^\W_IO]{25,39}(*ACCEPT)
# Anything else is NOT okay, and all remaining processing should stop
|(*COMMIT)[13][^\W_IOl0]{33}
)
""", flags=re.MULTILINE | re.VERBOSE)
test_str = ("0x7309f0134f3e51e8Cbe29dd86068e0f264f6c946\n"
"0x7a250d5630b4cf539739df2c5dacb4c659f2488d\n"
"0x6b1b45c925b29ea9d5bdde5490d7016edd288700\n"
"0x61765fc9f4e67612d53f29b31484D9e95cc3bdb3\n"
"0xD9cfbf343ac0eec25f5e2ead383fb4d57aaafbf9\n"
"0x870205573906a3122f3647d34775FF77cb33f90e\n"
"0x2dddae5c2c27ae6c1751cac72adacfe82a60f8a4\n"
"0xab06b7806eac2329c5585ddd08dd7fe4e13dde5d\n"
"bc1q3xe5n0j3qnsqc045e2vfx0246qzq5nyzag35xv\n"
"bc1qjw2g03cdnwcxh8gwfcypd3hu3s3md3aqe8zvrl\n"
"bc1qrupduyqlh4r5627vyz46fxker6wrf0sqt7he24\n"
"bc1qyemk24czaa6a2nr89nrz775wefg32d\n"
"17PZUMBg3gaPZvzC6jD4RMYT6J7D8ByzGa\n"
"1FMTSe43cKHTpR6r5xqEuE76hnFBkToGjY\n"
"35cydMA2G5i52XiM1wJ4EZf12fHdJ8hegQ\n"
"3PdD6TiMAdF34JieBgMSGAEFTMsHvQLBLC\n"
"DBs4WcRE7eysKwRxHNX88XZVCQ9M6QSUSz\n"
"DTkv31pUBjJUVrD34mAWf8Cp9BgEkUtNPM\n"
"DDTtqnuZ5kfRT5qh2c7sNtqrJmV3iXYdGG\n"
"DGottmgfevJzhhfmvGdA2JpMjMJ1DsSKjJ\n"
"D9a1Ah7mUNAJwNqHPER4DN9zNLoqcYFDZW\n"
"D5zikmZbvK6ReZSFPDVGusqP3qKcJTjo4r\n"
"DLCDJhnh6aGotar6b182jpzbNEyXb3C361\n"
"D61T1GVeMZM8UHvXKyyD55Ur9efAF2mb5f\n"
"XtbJQV8RWC39gMYsVdbRMCwMBDTAYPP99R\n"
"Xi7CnDniGd726iY4pQr79PTqWtZuVDGu8g\n"
"XxXhd59h44sRdvT3h5t2WXatox8Jhng9ob\n"
"XnjYnC83zC9VAAkf1hg7yPEHJrd3vJwR2d\n"
"XoCccXGPj16WZPzzD3UjsXRTPySZsAAXVD\n"
"Xh77YHy84s2mrsAWZftY1oZNZUakPHyL35\n"
"XuixmDKiB1fPzamnLoZw9Km3Lk7e2CyRT1\n"
"XbJvzQQCWxLNkRUeFq4nS5FQhwT1LWVXJh\n"
"bc1qyemk24czaa6a2nr89nrz775w\n\n"
"1x870205573906a3122f3647d34775ff77cb33f90e\n"
"Ox2dddae5c2c27ae6c1751cac72adacfe82a60f8a4\n"
"0xab06bg806eac2329c5585ddd08dd7fe4e13dde5d\n"
"0xD9cfbf343AC0eec25f5e_ead383fb4d57aaafbf9\n"
"bclq3xe5n0j3qnsqc045e2vfx0246qzq5nyzag35xv\n"
"bc1yemk24czaa6a2nr89nrz775wvptxg57yIe750ut\n"
"0xab06b7806eac2329c5585ddd08dd7fe4\n"
"25cydMA2G5i52XiM1wJ4EZf12fHdJ8hegQ\n"
"3PdD6TIMAdF34JieBgMSGAEFTMsHvQLBLC\n"
"lFMTSe43cKHTpR6r5xqEuE76hnFBkT0GjY\n"
"12GFUMBg3gaPZOzC6lD4RMYT6J7D8ByzGa\n"
"DI1T1GVeMZM8UHvXKyyD55Ur9efAF2mb5f\n"
"D4JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n"
"D41T1GVeMZM8UHvXKyyD55Ur9efAF2mb5f\n"
"D1zikmZbvK6ReZSFPDVGusqP3qKcJTjo4r\n"
"DOTtqnuZ5kfRs5qh2c7sNtqrJmV3iXYdff\n"
"DLCDJhnh6aGotar6b182jpzbNEyXb3C36l\n"
"XoGGGXGPj06WZPzzD3UjsXRTPySZsAAXVD\n"
"Xh66YHy22s2mrsAWZftYIoZNZUakPXYdff\n"
"XuixmDKiBlfPzamnLoZw9Km3Lk7e2CyRT1\n"
"XBBBBBBCCCCCCRUeFq4nS5F0hwT1LLLLLh\n"
"bc1qemk24czaa6a2nr89nrz775w\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