# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"([8:;]-?[)DP}>]|[[({<]-?[8:;])"
test_str = (":-)--\n"
":-%\n"
":-)-{8\n"
":>)\n"
":-X\n"
"*:o)\n"
":->|\n"
"o-)\n"
"=:-)\n"
">:)\n"
":-{\n"
":-)))))))\n"
"[:|]\n"
"@>--;--\n"
":%)%\n"
":-=)\n"
":-s\n"
"(ap)\n"
":-o\n"
"OOOOOO\n"
"(8>/--<\n"
"(.V.)\n"
"(.!.)\n"
":-O\n"
":-|\n"
":%)\n"
"(:I\n"
":-0\n"
"O:)\n"
"O:-)\n"
"O-)\n"
"0=)\n"
"0:-)\n"
"(a)\n"
"^j^\n"
"0*-)\n"
"0;-)\n"
"o:-)\n"
"X(\n"
"X-(\n"
"O\n"
"b (\n"
">:-)\n"
">:-(\n"
"(:-&\n"
":@\n"
":(\n"
":-t\n"
":-||\n"
":-@\n"
":-Z\n"
"|_|'\n"
"-_-;\n"
"^^;\n"
"??\n"
"@_@\n"
"(-_-* )\n"
"( o_o)\n"
"<:-I\n"
"=D>\n"
":*)?\n"
":*) ?\n"
"l-)\n"
"|-I\n"
"|-)\n"
"~X(\n"
"(-:\n"
"(au)\n"
":o)\n"
":=8)\n"
"~O><\n"
"~:O\n"
"~:0\n"
"X:-)\n"
"~#:-(\n"
"?:-)\n"
"~~8-O\n"
"C:-|\n"
"(:-)\n"
"((\n"
"(::( )::)\n"
"(::[]::)\n"
"o >\n"
":-E\n"
"D:-)\n"
"q:-)\n"
"d:-)\n"
"d:-p\n"
":)\n"
":-{0\n"
"^v^\n"
"B-)\n"
";;)\n"
"(brb)\n"
"(''')-.-(''')\n"
"(\") (\")\n"
":>)=\n"
":)#\n"
":-){\n"
"(:-{~\n"
"b-(\n"
"%+|\n"
": =\n"
"0___\n"
"X:-|\n"
"%-|\n"
"(b)\n"
"&:-o-8-<\n"
"(*)/ (*)\n"
":D\n"
":-D\n"
">:D<\n"
":------------)\n"
"(:+)\n"
":)) \n"
":-(=)\n"
"<(:?)\n"
"=|:O}\n"
"~O~\n"
"(\n"
"|-O\n"
"(^)\n"
"*<:)\n"
":->\n"
":-]\n"
"(:<)\n"
"(:-D\n"
"?-(\n"
"!-(\n"
"(bah)\n"
"(:-\n"
"#-)\n"
"^^\n"
"%')\n"
":-{}\n"
"`-`\n"
":\")\n"
":,')\n"
":-\">\n"
"(@_@)\n"
"@=\n"
":-(\n"
"l-o\n"
"\\-o\n"
":-!\n"
":-O ZZ ZZ ZZ\n"
":-}X\n"
"(||)\n"
"===O____iii\n"
"Q(''q) Q(''Q)\n"
"(z)\n"
"( '}{' )\n"
">:*)\n"
":-#\n"
"%-(\n"
"=((\n"
"</3\n"
"(U)\n"
"(:^(\n"
":^)\n"
"}:-(\n"
":-c\n"
" U U \n"
"#:-)\n"
":-#|\n"
"(_|_)\n"
"}i{\n"
"}|{\n"
"})i({\n"
"(p)\n"
":()\n"
"P=\\\\\n"
"~\n"
"=^.^=\n"
">'o'<\n"
">^..^<\n"
">^,,^<\n"
"}:-X\n"
"(@)\n"
">;3\n"
"Q:-)\n"
"(:@@@@@@@@@@@@@@@D\n"
"C|:-=\n"
";)\n"
"\\o/\n"
"*\\O/*\n"
"C=:-)\n"
"(-: =3\n"
"8^\n"
"~:>\n"
"C8o \\\n"
"C8o )\n"
"C8o (\n"
";-(\n"
"<|-)=\n"
"-{:-]\n"
"*<<<<=\n"
"*<<<<+\n"
"<{^-^}>\n"
"=====~\n"
"(ci)\n"
":-.)\n"
"(:)\n"
":-)\n"
"(o)\n"
"<|:-()}\n"
"<|:^0|<\n"
"<]:o){\n"
"*<):O)\n"
"*<:O)\n"
":O)\n"
":*)\n"
"(c)\n"
"?_?\n"
"P-)\n"
"$:-)\n"
"(co)\n"
":-r\n"
":-8(\n"
"O.o\n"
"%)\n"
"%-)\n"
":s\n"
":-S\n"
":-Q\n"
":-$\n"
":-/\n"
"3:08\n"
"3:-O\n"
"+/'\\\n"
"<):)\n"
"<):-)\n"
"}:-)\n"
"{:-)\n"
"V.v.V\n"
"H-)\n"
"T_T\n"
"T^T\n"
"QQ\n"
"=O ::::::\n"
"='(\n"
"&.(..\n"
"(;_;)\n"
":'(\n"
":'\n"
":'-(\n"
":*(\n"
":*-(\n"
":((\n"
":..[\n"
":_ (\n"
":`-(\n"
";_;\n"
":'-)\n"
"|_|\n"
"C(_)\n"
"~o)\n"
"|_P\n"
"&:-)\n"
"@:-)\n"
":-@!\n"
"O-(\n"
"0-)\n"
"*-(\n"
"<(..<)\n"
"\\\\:D/\n"
"(>..)>\n"
"^(. .)^\n"
"C8<]\n"
"Q:|\n"
"8->\n"
"*-*\n"
"8-#\n"
":-| :-|\n"
":-9\n"
":-[\n"
"}=^{|~\n"
"]:->\n"
"()}:o)\n"
"-6\n"
">:->\n"
"}:->\n"
":>\n"
";->\n"
"/\\\n"
"=\\\n"
":|\n"
":(&\n"
":-e\n"
"DX\n"
"/:(\n"
"%-}\n"
"d[-_-]b\n"
"[:-}\n"
"d^_^b\n"
"<[.,=.,]-\n"
":O$\n"
":O\\'\n"
":O/\n"
":O?\n"
":3-<\n"
":3-]\n"
"8==3\n"
"&===3\n"
"(&)\n"
"(>.<)\n"
"#-o\n"
":-) 8\n"
":$)\n"
":-))\n"
"}:-(=\n"
"(:-|K-\n"
"\\_/\n"
"*DRINK*\n"
":-). . .\n"
"=P~\n"
"*DROOLING*\n"
":P\n"
":-P\n"
":-)~\n"
":-P```\n"
":-B\n"
":~)\n"
":#)\n"
":-}\n"
"%-\n"
"./\n"
"8)\n"
"<:-)\n"
"<:I\n"
"<:-(\n"
"(e)\n"
"<:-0\n"
":~\n"
"2:)\n"
"@=)\n"
"5:-)\n"
"&:-/\n"
":$\n"
"T-T\n"
"//_^\n"
"(//.^)\n"
"(//_^)\n"
"0|-)\n"
"(.\\|/.)\n"
">-)\n"
":-6\n"
"8-)\n"
"}=D\n"
"-@--@-\n"
"# -\n"
"(p ^^)=====O\n"
"o,..,o\n"
"^,..,^\n"
">-\n"
"/ | | |\n"
"(~)\n"
"(yn)\n"
"><(((\">\n"
"<><\n"
"<*))))><\n"
"<((((><\n"
"<\")))><\n"
"<.{{{><\n"
"}-(((*>\n"
"{}{\n"
";-)\n"
"@>---\n"
"()\n"
"G:-)\n"
"=:-H\n"
"%%-\n"
"7:-)\n"
"/:-)\n"
" \n"
"8)~~*\n"
"<? ?>\n"
":(?)\n"
"[II]D\n"
"(:-(\n"
":-<\n"
"):-(\n"
"X[\n"
"=P\n"
"><\n"
"://\n"
"\\~/\n"
"*:*\n"
": 0=/--\n"
"8=:-)\n"
":O\n"
"4:-)\n"
"~~:-(\n"
"(g)\n"
"*GIGGLING*\n"
">:o===Q<\n"
"8:^)\n"
"(x)\n"
"-o-o-\n"
"8*)\n"
"8:-)\n"
"(nah)\n"
":-{>\n"
":-)>\n"
"|-|\n"
"o/\n"
"8:]\n"
"%:O\n"
":8]\n"
"(~};)\n"
":^D\"\n"
"$_$\n"
"(____)\n"
"$8()\n"
"(^:^)\n"
"E:-)\n"
"E-:-)\n"
"(%)\n"
":-3\n"
":-})\n"
"&:-]\n"
"U\n"
"|___|\n"
"=)\n"
"^.^\n"
"^?^\n"
"^-^\n"
" :-)\n"
"3:8)\n"
":@)\n"
"<~8)\n"
">O<\n"
"/* *\n"
":-'\n"
":-)}\n"
"-:-)\n"
":=)\n"
"<<<<(:\n"
"<<<<(:-)\n"
":-`|\n"
"(({..}))\n"
"<u3\n"
"<3\n"
"(:-...\n"
"|:-)\n"
"(h5)\n"
"^5\n"
":-I\n"
":-\\\n"
":-,\n"
"|-D\n"
"L.\n"
"(8-(1)\n"
"(_8^(|)\n"
"( o ) ( o )\n"
"[_]\n"
"(h)\n"
"{ }\n"
"((((name))))\n"
"(:)\\/<\n"
":)X\n"
"<(^.^<)\n"
"<(*.*<)\n"
"((()))\n"
":D<\n"
"{{{***}}}\n"
"(()):**\n"
"%*@:-(\n"
"%-\\\n"
":0\n"
"XD\n"
"@-)\n"
"O[-<]:\n"
":[\n"
"((:-/\n"
"?$?:-)\n"
">;-('\n"
":-) .\n"
":-) ,\n"
"#;-)\n"
":+(\n"
"(-.-)ZZZ\n"
"~oO>\n"
"(:-$\n"
"*red+u\n"
"*help\n"
"*IN LOVE*\n"
"(*_*)\n"
"._.\n"
":7/\n"
"8\n"
"%7<\n"
"(ip)\n"
"?:^[]\n"
":###)\n"
"//o-o\\\\\n"
"(8 {\n"
"X-p\n"
"*JOKINGLY*\n"
"8-*\n"
"@:-}\n"
":-T\n"
"\\VVV/\n"
"\\$$$/\n"
"<('.'<)\n"
"<(^.^)>\n"
"<( '.' <)\n"
"<( '.' )>\n"
"(>'.')>\n"
"=\n"
"*\n"
":-*\n"
":-)*\n"
";-(!)\n"
"(_X_)\n"
"*KISSED*\n"
":*\n"
":}{:\n"
"*KISSING*\n"
"(}{)\n"
"(:-*\n"
"( '}~{' )\n"
":pd:\n"
"=+=\n"
"=^w^=\n"
":3\n"
"@(*o*)@\n"
":*)O\n"
"<{::}>\n"
"(::)<\n"
"C:-)\n"
"l8r)\n"
":))\n"
";-D\n"
"%OD\n"
"=D\n"
"%-(I)\n"
":.-)\n"
"?-:\n"
"({)\n"
")-:\n"
">;->\n"
":^o\n"
"(i)\n"
"(li)\n"
";-,\n"
"(:)-)\n"
":X\n"
"[:-)\n"
":-----)\n"
"<@> <@>\n"
">_>\n"
"<_<\n"
"(*)?(*)\n"
"<.< >.>\n"
"<o?o>\n"
"<*_*>\n"
":-?\n"
"L-)\n"
"%+{\n"
":-) :-) :-)\n"
"(>^.^)> <3 <(^.^<)\n"
":x\n"
"(m)(m)(m)\n"
"~:(\n"
"=/\n"
">=[\n"
">=(\n"
">:-<\n"
">,<\n"
"&-L\n"
":-(*)\n"
":-\n"
"@@@@@:-)\n"
"@@@@:-)\n"
"(#-[\n"
":-)(-:\n"
"(d)\n"
"3:[\n"
"\\m/\n"
"�O�\n"
"8(:-)\n"
"o/<\n"
"o|-<\n"
":<\n"
":p\n"
":~/\n"
"(mp)\n"
"^o^\n"
"(mo)\n"
"$-)\n"
"@(-_-)@\n"
"---\n"
"@(^_^)@\n"
":E\n"
"(00)\n"
"(|)\n"
"(_i_)\n"
"oO~\n"
"~<>^>\n"
"<:3)~~\n"
"<:3)~\n"
"<:3 )~\n"
":-{)\n"
":-{)}\n"
"8-o\n"
"~O-O~\n"
"(m)\n"
"l_l)\n"
"={D\n"
"{ 8{]\n"
":{\n"
":-{)=\n"
"{:-{)}\n"
":-:\n"
":-x\n"
":-SS\n"
"~,~\n"
"*:-)\n"
"(-)\n"
"8-|\n"
"*8-I\n"
"E-:-I\n"
"{}\n"
"|:-0\n"
":/i\n"
":/)\n"
"[-(\n"
"-8\n"
"8-O\n"
"#:-O\n"
"#:-o\n"
"?:-_]\n"
"|:-{)~\n"
":)]\n"
".-]\n"
".-)\n"
",-)\n"
"':-(\n"
"':-�\n"
"�-)\n"
"'-)\n"
"=X\n"
"=^)\n"
":d\n"
"^_^\n"
"(^o^)\n"
" \n"
"<.....\n"
"(<. . . . .\n"
"(:V)\n"
":v\n"
"<:o)\n"
"<:-P\n"
"<l:0\n"
"*<(8)~/~<\n"
"*<|8-P~\n"
"(:V\n"
"(/|\\)\n"
":)>-\n"
"8>\n"
"<:^]\n"
"3:]\n"
">:P\n"
":?)\n"
"%\\v\n"
"%-^\n"
"----|}\n"
"o()~\n"
"=8)\n"
":8)\n"
":(:)\n"
"(o^-^o)\n"
"^_^''\n"
"(_)\n"
":---)\n"
":-------[\n"
"P-(\n"
"<|\n"
"<%)\n"
"(pi)\n"
"(pl)\n"
"}:^#)\n"
"[::::]\n"
"****\n"
"+O=-)\n"
";-\\\n"
"O/\n"
"[-o<\n"
"&&&&\n"
"\\<><>/\n"
"~<:-)\n"
"\\&&&/\n"
";~[\n"
"(+[ ]-:-)\n"
"=:-(\n"
"Q('.'Q)\n"
":-($)\n"
"\\%%%/\n"
"=:>)\n"
" (___)0\n"
"/:)\n"
":-R\n"
"=:7)~~\n"
"=:7(~~\n"
"--- :\n"
":-C\n"
"~:-(\n"
"()_RED_(>\n"
"(l)\n"
"(k)\n"
"(f)\n"
"}---:o>\n"
"+-(:-)\n"
">=D\n"
"(})\n"
"<(-_-)>\n"
"[:]\n"
"\\m/>.<\\m/\n"
"\\m/(**)\\m/\n"
"\\m/ >_< \\m/\n"
">-D\n"
"\\w/^^,\\w/\n"
"9_9\n"
">>\n"
"=))\n"
"7:)\n"
"7:^]\n"
"@~'~~~\n"
"@~)~~~~\n"
"@>-;--\n"
"@}>-'-,--\n"
"@};-\n"
"@};---\n"
"@}->--\n"
"@)->-\n"
"@->--\n"
"@-}----\n"
"@>;-----\n"
"3:*>\n"
"Y_Y\n"
"T.T\n"
"D=\n"
"D:\n"
"=[\n"
"=(\n"
"(<_>)\n"
":c\n"
"*<|:-{)}\n"
"*<|:-)\n"
"*<|:^) }\n"
"*<:-)\n"
":-7\n"
"^o)\n"
"*!#*!^*&:-)\n"
"!:-)\n"
"8<\n"
")8-)\n"
"\\';./\n"
"(-_-)\n"
"::=))\n"
"8==8\n"
":-i\n"
"[-x\n"
"<(((\">\n"
",:-)\n"
"o_o\n"
"35277\n"
"=o\n"
"*SHOCKED*\n"
"+-(\n"
":-V\n"
"(*^_^*)\n"
"(-::-)\n"
"=+o()\n"
":-&\n"
":-Y\n"
"8-}\n"
"(c:\n"
"~:-P\n"
"o{-<]:\n"
"O-\\-<]:\n"
"0-<-<):\n"
"o<[^(\n"
";-/\n"
"':-/\n"
"8-X\n"
"(>.<) zzZ\n"
"(s)\n"
"u_u\n"
"#)\n"
"#(,'%/)\n"
"C:\n"
"=o)\n"
"[______]\n"
":|)\n"
"(^_^)\n"
"+:-)\n"
"=:-#}\n"
"(:-#\n"
"):-)\n"
"g-)\n"
":^J\n"
"^&^\n"
":-1\n"
":^,\n"
";^)\n"
":-d\n"
"@x\n"
"(sn)\n"
"~~~~8}\n"
"(so)\n"
"X P\n"
"=.=\n"
"(X^(*\n"
"}:8>\n"
":-M\n"
":-W\n"
":-`\n"
":-( <|\n"
"(*)\n"
"*~*\n"
"/ \\\n"
":-p\n"
":pp\n"
"$:-$\n"
"*STOP*\n"
"(st)\n"
"-.-\n"
"@?@\n"
"&;-P\n"
"B:-)\n"
"B :-)\n"
"(8-{)}\n"
"/8^{~\n"
"(#)\n"
" /'\n"
"\\m/<(^_^)>\\m/\n"
"*SURPRISED*\n"
"{:o\n"
":o\n"
":#\n"
"`:-)\n"
"oxx:{}:::::::>\n"
"/________|___|\n"
"---(|||]==[]\n"
"=;\n"
":-{ }\n"
":^y\n"
":-8\n"
":-v\n"
"&-|\n"
"(t)\n"
"-(:)(0)=8\n"
">[I\n"
"(:>-<\n"
":-)---\n"
"*-)\n"
"(n)\n"
"*THUMBS UP*\n"
"(y)\n"
"^\n"
"=_=\n"
"*TIRED*\n"
"(:|\n"
"0000(0)(0)0000\n"
"8-;)\n"
":-J\n"
":-A\n"
"*!#*!^*&:-\n"
"=-HHHH\n"
">:-|\n"
":-)))\n"
"@:I\n"
"<:>==\n"
"(tu)\n"
"=-o\n"
"(o|o)\n"
"(um)\n"
"X:-/\n"
"=):-)\n"
":\\\n"
"**==\n"
"|:-|\n"
">.<\n"
">:*\n"
"}:(\n"
":<|\n"
"::-)\n"
":u)\n"
":n)\n"
"}(:-(\n"
"@,.,@\n"
"(';.;')\n"
"%*}\n"
":-[]\n"
"(:-\\\n"
"(o^_^)o\n"
":-w\n"
":-h\n"
":-)X\n"
"d:)\n"
"{(:-)\n"
"B-|\n"
"(|:-)\n"
"]-I\n"
"(8-)\n"
":-)8\n"
"-_-\n"
"*WHINING*\n"
":-\"\n"
";^?\n"
"(w)\n"
"())=(\n"
"(`_^)\n"
";p\n"
";O)\n"
";-P\n"
"~_^\n"
"<):^/\n"
"*|:-)\n"
"8<:-)\n"
"8 :-)\n"
"-=#:-)\n"
"-=#:-) /\n"
":-)8 :\n"
",-}\n"
"(xx)\n"
"_/)\n"
"|-()\n"
"|^O\n"
">:O\n"
":-(0)\n"
"=:-0\n"
"@@(: l)\n"
":-l\n"
"<(-.-)>\n"
":-( )\n"
":--------)\n"
"(@ @)\n"
":-0>\n"
"|-P\n"
"->=:-)")
matches = re.finditer(regex, test_str)
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