Пространства в регулярных выражениях Python

В настоящее время я пишу скрипт Python, который будет искать весь файл .c или .h и найти все определения функций, чтобы затем внести некоторые небольшие изменения. Чтобы найти все определения функций, я пытаюсь использовать регулярные выражения.

У меня в настоящее время есть:

"r'\w+?\s+?\w+?\s*?\(.*?\)[\n\s]*?{"

Проблема с этой логикой заключается в том, что в некоторых случаях она будет принимать определенные операторы if. Например:

else
 if(//herpderp){}

Он делает это, потому что \s включает \n. Я чувствую, что у меня не было бы этой проблемы, если бы у меня было выражение только для поиска пробелов вместо каких-либо пробелов, но я не могу проверить свою теорию, поскольку, кажется, нет \(insert letter here) только для простого пространства,

Таким образом, есть проблема. Если у вас есть какие-либо советы относительно того, как исправить мое регулярное выражение, или если есть лучший способ написания сценария в целом, пожалуйста, дайте мне знать.

2 ответа

Единое пространство может быть сопоставлено с использованием одного пространства, так же, как и любой другой символ, который не является метасимволом:

"r'\w+? +?\w+? *?\(.*?\)\s*?{"

' +?' последовательность соответствует только одному или нескольким пробелам, не жадному. Я заменил [\n\s] на \s поскольку \n уже включен.

Вы можете перейти к классу символов с большим количеством типов пробелов:

[ \t]

который будет соответствовать пробелу или вкладке.


Он делает это, потому что \s включает\n

Я не уверен, что это хорошая теория, так как написано что-то подобное в C разрешено:

int


 main()

Возможным способом может быть использование черного или белого списка для обеспечения того, что вы получаете функцию. Пример:

r'\b(int|float|******|char)\s+(\w+)\s*\([^)]*\)\s*{' // whitelist

или

r'(?!(?:else)\b)\b(\w+)\s+(\w+)\s*\([^)]*\)\s*{' // blacklist

Примечание: нет необходимости использовать ленивые квантификаторы.

licensed under cc by-sa 3.0 with attribution.