import re
regex = re.compile(r"(?<=^|[^_])__(((\\_)|((?![\s_])(?:(?:[^_]|_(?!_))+?)?[^\s_]))+)__(?=[^_]|$)", flags=re.MULTILINE)
test_str = ("-- funciona\n"
"__foo bar__\n"
"__f o o b a r__\n"
"**teste __lorem ipsum__ dolor sit**\n"
"__teste **lorem ipsum** dolor sit__\n"
"abc__xyz__teste\n\n"
"-- não funcionava na primeira versão\n"
"__foo_bar__\n"
"__a__\n"
"__*__\n"
"__foo_*bar__\n\n"
"-- não é para funcionar\n"
"__ foo bar__\n"
"__foo bar __\n"
"_foo__\n"
"__ foo __\n"
"_foo_\n"
"__foo_\n"
"__ __\n"
"__a____\n"
"____a__\n"
"_____\n\n"
"-- corner case: aninhado (não tratei pois não sei o que deveria fazer)\n"
"__abc__xyz__123__\n"
"__abc __xyz__ 123__\n\n"
"-- corner case: escape (chega a reconhecer alguns casos, mas não substitui \"\\_\" por \"_\"\n"
"__\\___\n"
"__a\\___\n"
"__abc\\___\n"
"__\\_abc_\\__ -- errado, mas não consegui tratar")
subst = "<i>\\1<\\i>"
result = regex.sub(subst, test_str)
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