#python #regex #spaces
#python #регулярное выражение #пробелы
Вопрос:
В настоящее время я пишу скрипт на Python, который будет искать весь .c
.h
файл or и находить все определения функций, чтобы затем я мог внести некоторые небольшие изменения. Чтобы найти все определения функций, я пытаюсь использовать регулярные выражения.
В настоящее время у меня есть:
"r'w ?s ?w ?s*?(.*?)[ns]*?{"
Проблема с этой логикой заключается в том, что в настоящее if
время в некоторых случаях она принимает определенные операторы. Например:
else
if(//herpderp){}
Он делает это, потому что s
это включает n
. Я чувствую, что у меня не было бы этой проблемы, если бы мое выражение искало только пробелы вместо любых пробелов, но я не могу проверить свою теорию, поскольку кажется (insert letter here)
, что для простого пробела нет.
Итак, проблема есть. Если у вас есть какие-либо советы о том, как исправить мое регулярное выражение, или если есть лучший способ написания сценария в целом, пожалуйста, дайте мне знать.
Ответ №1:
Один пробел может быть сопоставлен с помощью одного пробела, так же, как вы сопоставили бы любой другой символ, который не является метасимволом:
"r'w ? ?w ? *?(.*?)s*?{"
' ?'
Последовательность соответствует только одному или нескольким пробелам, не жадно. Я заменил [ns]
на s
, поскольку n
он уже включен.
Вы можете расширить класс символов с большим количеством типов пробелов:
[ t]
который будет соответствовать пробелу или табуляции.
Ответ №2:
Это происходит потому, что s включает n
Я не уверен, что это хорошая теория, поскольку разрешено писать что-то подобное на C:
int
main()
Возможным способом может быть использование черного или белого списка, чтобы убедиться, что то, что вы получаете, является функцией. Пример:
r'b(int|float|double|char)s (w )s*([^)]*)s*{' // whitelist
или
r'(?!(?:else)b)b(w )s (w )s*([^)]*)s*{' // blacklist
Примечание: нет необходимости использовать отложенные кванторы.
Комментарии:
1. Честно говоря, я не думаю, что C является обычным языком, поэтому regex плохо подходит для его анализа. Вероятно, было бы проще реорганизовать его в его редакторе, чем писать программу на Python для этого 🙂
2. @AdamSmith: Я не специалист по C, но я не уверен, что вложенные круглые скобки разрешены внутри параметров. В любом случае, тот факт, что язык является регулярным или нет, больше не является проблемой для современных движков регулярных выражений (в частности, с новым модулем регулярных выражений).
3. Я не использовал модуль регулярных выражений — стоит ли его изучать и изучать?
4. @AdamSmith: да, он прост в установке (без проблем), относительно прост в освоении и использовании (обратная совместимость с модулем re) и обладает очень интересными функциями, которые вы нигде не найдете на других языках сценариев (например, нечеткий поиск)