Эта проблема немного сложна, может зависеть от наших входных данных и может быть решена частично с помощью регулярных выражений и частично с помощью сценариев, например, мы будем начинать с выражения, которое проходит через новые строки, такие как:
(TASK.+)\s*({[\s\S]*})\s*void
(TASK.+)\s*({[\w\W]*})\s*void
(TASK.+)\s*({[\d\D]*})\s*void
здесь у нас есть начальная граница, которая является нашим первым желаемым выводом:
(TASK.+)
и левая и правая границы вокруг нашего второго желаемого результата:
\s*({[\s\S]*})\s*void
и правая граница, скорее всего, изменится:
\s*void
RegEx
Если это выражение не нужно и вы хотите изменить его, перейдите по этой ссылке на regex101.com .
RegEx Circuit
jex.im визуализирует регулярные выражения:
![enter image description here](https://i.stack.imgur.com/x12Fx.png)
Test
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(TASK.+)\s*({[\s\S]*})\s*void"
test_str = ("TASK(arg1)\n"
"{\n"
" if (cond)\n"
" {\n"
" /* Comment */\n"
" function_call();\n"
" if(condIsTrue)\n"
" {\n"
" DoSomethingelse();\n"
" }\n"
" }\n"
" if (cond1)\n"
" {\n"
" /* Comment */\n"
" function_call1();\n"
" }\n"
"}\n\n\n"
"void FunctionIDoNotWant(void)\n"
"{\n"
" if (cond)\n"
" {\n"
" /* Comment */\n"
" function_call();\n"
" }\n"
" if (cond1)\n"
" {\n"
" /* Comment */\n"
" function_call1();\n"
" }\n"
"}")
matches = re.finditer(regex, test_str, re.MULTILINE)
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.