import re
regex = re.compile(r"""
<!ELEMENT\s+
((?'elname'\S+)\s+)
((?'rank'\d+)\s+)?
(?'tagOmit'
(?'start'[-oO])\s+
(?'end'[-oO])\s+
)?
(?'content'
(?'keyword'(ANY|EMPTY|CDATA|RDATA))|
(?'contentGrp' \(.*\)[*+?]?)
)
(?'exceptions'
(\s+\-(?'exclusion'\(.+\)))?
(\s+\+(?'inclusion'\(.+\)))?
)
\s*>
""", flags=re.MULTILINE | re.VERBOSE)
test_str = ("<!ELEMENT FTNOTE - - ((PARA | PARA-EFF-GROUP | PARA-EFF-CHOICE | TABLE | UN-LIST | NOTE | TABLE-EFF-GROUP | TABLE-EFF-CHOICE)+)\n"
" -(FTNOTE | NOTE | TABLE | GROUND-TEST | CORRECTIVE-ACTION)>\n"
"<!ELEMENT ENTRY - - (WARNING | CAUTION | NOTE | (PARA | UN-LIST | PARA-EFF-GROUP | PARA-EFF-CHOICE)*)\n"
" -(ENTRY | GRAPHIC-COLLECTION)\n"
" +(INFOMARK | FTNOTE-REF)>\n"
"<!ELEMENT COLSPEC - o EMPTY>\n"
"<!ELEMENT TGROUP - - (COLSPEC+, THEAD?, TBODY)>\n\n"
"<!ELEMENT TABLE - - (TITLE?, TGROUP, FTNOTE*)\n"
" -(TABLE | TABLE-NO-TITLE | GROUND-TEST | CORRECTIVE-ACTION)\n"
" +(INFOMARK | INCLUDED-SUBDOC | INCLUDED-SOURCE-DATA | EFF-NONE)>")
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