import re
regex = re.compile(r"^\s*(\w+)(?:\s+(V[0-9A-F]|0x[0-9A-F]+|[0-9]+|I|DELAY|SOUND))?(?:,\s+(V[0-9A-F]|0x[0-9A-F]+|[0-9]+|DELAY))?(?:,\s+([0-9]+|0x[0-9A-F]))?\s*$", flags=re.MULTILINE | re.IGNORECASE)
test_str = ("NOP\n"
"CLEAR\n"
"RETURN\n"
"JUMP 0x123\n"
"CALL 0x123\n"
"IFEQ V3, 42\n"
"IFNE V5, 0x4A\n"
"IFEQ V2, V4\n"
"SET VE, 42\n"
"ADD V7, 56\n"
"SET V4, V6\n"
"OR V9, V0\n"
"AND V4, V6\n"
"XOR V2, V9\n"
"ADD VF, VD\n"
"DEC V8, V3\n"
"RSH V6\n"
"SUB V3, V8\n"
"LSH VB\n"
"IFNE V8, V9\n"
"SET I, 0x200\n"
"JMPO 0x230\n"
"RAND V0, 68\n"
"DRAW V2, V3, 0xF\n"
"IFKEY V9\n"
"IFNKEY V8\n"
"SET V8, DELAY\n"
"WAIT V7\n"
"SET DELAY, VA\n"
"SET SOUND, VB\n"
"ADD I, V0\n"
"SPRITE VD\n"
"BCD 7\n"
"DUMP VF\n"
"LOAD V3")
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