#python #python-3.x #regex
#python #python-3.x #регулярное выражение
Вопрос:
Я анализирую C
файл кода с помощью Python, и мне нужно найти все вызовы функций, но не определения функций. Например:
txt = "foo(param1, bar1(foobar()), param2, !bar2(param3));"
должно дать мне что-то вроде foo, bar1, foobar, bar2
.
Регулярное выражение, которое я использую, это "w ("
:
import re
x = re.findall("w (", txt)
но тогда оно также будет соответствовать определению функции следующим образом:
text = "void foo(int param) {"
Как мне изменить мое регулярное выражение?
Ответ №1:
Возможно, вам удастся избежать использования отрицательного прогноза в шаблоне сопоставления, который утверждает, что {
во входной строке не отображается:
txt = "foo(param1, bar1(foobar()), param2, !bar2(param3));"
matches = re.findall(r'(?!.*{)bw (?=()', txt)
print(matches)
Это выводит:
['foo', 'bar1', 'foobar', 'bar2']
Но ваш второй ввод не имеет совпадений:
txt = "void foo(int param) {"
matches = re.findall(r'(?!.*{)bw (?=()', txt)
print(matches)
Это выводит:
[]
Комментарии:
1. Спасибо, я пытаюсь расшифровать ваше регулярное выражение 🙂 Я не понимаю, почему эта группа
(?!.*{)
остается впереди, но не позади.2. @hydradon Отрицательный прогноз
(?!.*{)
говорит с самого начала строки утверждать, что{
это не встречается нигде позже в строке (т. Е. От начала до конца). Мы не хотим приводить это утверждение позже, потому что тогда оно может привести к некоторым ложным срабатываниям.