# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = 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*$"
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 = re.finditer(regex, test_str, re.MULTILINE | re.IGNORECASE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
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