Python: регулярное выражение для поиска всех вызовов функций в файле, но не определения функции

#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 Отрицательный прогноз (?!.*{) говорит с самого начала строки утверждать, что { это не встречается нигде позже в строке (т. Е. От начала до конца). Мы не хотим приводить это утверждение позже, потому что тогда оно может привести к некоторым ложным срабатываниям.