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

#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) и обладает очень интересными функциями, которые вы нигде не найдете на других языках сценариев (например, нечеткий поиск)