import re
regex = re.compile((r"(?xsm) # free-spacing mode, multi-line\n"
r"(?=.*?pig) # lookahead: if pig is not there, fail right away to save the effort\n"
r"(?: # start counter-line-skipper (lines that don't include pig)\n"
r" (?: # skip one line that doesn't have pig\n"
r" ^ # beginning of line\n"
r" (?:(?!pig)[^\r\n])* # zero or more chars not followed by pig\n"
r" (?:\r?\n) # newline chars\n"
r" ) \n"
r" # for each line skipped, let Group 1 match an ever increasing portion of the numbers string at the bottom\n"
r" (?= # lookahead\n"
r" [^:]+ # skip all chars that are not colons\n"
r" ( # start Group 1\n"
r" (?(1)\1) # if Group 1 is set, match Group 1\n"
r" # (?>\1?) # alternate phrasing for the above\n"
r" :\d+ # match a colon and some digits\n"
r" ) # end Group 1\n"
r" ) # end lookahead\n"
r")*+ # end counter-line-skipper: zero or more times\n"
r".*? # match\n"
r"\K # drop everything we've matched so far\n"
r"pig # match pig (this is the match!)\n"
r"(?=[^:]+(?(1)\1):(\d+)) # capture the next number to Group 2"))
test_str = ("my cat pi g\n"
"dog pi g\n"
"my pig\n"
"my cow\n"
"my mouse\n\n"
":1:2:3:4:5:6:7")
subst = "\\2"
result = regex.sub(subst, test_str, count=1)
if result:
print(result)
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