import re
regex = re.compile(r"[^\w](?<!->)(trans|trans_choice|Lang::get|Lang::choice|Lang::trans|Lang::transChoice|@lang|@choice|__)\s*\(\s*((?<![\\])['\"])((?:.(?!(?<![\\])\2))*.?)\2\s*[,\)]")
test_str = ("Should match variations on method:\n"
"trans('a.b');\n"
"trans_choice('a.b')\n"
"Lang::get('a.b');\n"
"Lang::choice('a.b', 1);\n"
"Lang::trans('a.b');\n"
"Lang::transChoice('a.b', 2);\n"
"@lang('language.line')\n"
"@choice('language.line', 1);\n"
"__('a.b')\n\n"
"Should match variations of contained string\n"
"trans('key'); // No group, so JSON style\n"
"__('Json string')\n"
"trans('a.b');\n"
"trans('a.b.c');\n"
"trans('a_b.c-d');\n"
"trans('a.b!');\n"
"trans('a.translate me!');\n"
"trans('a.über~');\n"
"trans(\"app.i'm\"); // contained quote of different type\n"
"trans('app.\"ok\"');\n"
"trans('with contained \" quotes');\n"
"trans('with an escaped \\' quote')\n"
"trans('with a double \\\\')\n\n"
"Should match additional variables and whitespace\n"
"trans('a.b', [1,2]);\n"
"trans ( \n"
" ' with whitespace ' , $var)\n\n"
"Typical use cases\n"
"(trans ( 'lang.line'));\n"
"<span>@lang('lang.line')</span>\n\n"
"Should not match:\n"
"trans($var); // No quotes\n"
"trans(); // Nothing\n"
"anytrans('group.key'); // not the method we need\n"
"1trans('lang.file'); // not the method\n"
"_trans('lang.file'); // not the method\n"
"->trans('lang.line');\n"
"trans(\\'why do we have an escaped quote here?\\')\n"
"trans('with a triple \\\\\\') <-- fail!\n"
"trans('lang.line' . $middle); // concatenated vars\n"
"trans('lang.line' . $middle . '.ending'); // concatenated vars\n"
"___('hello') // not the method we need\n")
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