Как правильно использовать символ отрицания [^], чтобы сделать слова нефиксированной ширины назад? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сопоставить все строки исходного кода Python, в которых есть открытые скобки, но это не определение функции.По сути, сопоставьте все вызовы функций, но не определения функций.

Я анализирую исходный код Python, но у меня есть только движок PCRE, а не новый Javascript с просмотром без фиксированной ширины.Я пытаюсь не соответствовать, если предложению предшествует слово def в любом месте (.*) перед совпадением.

Это регулярное выражение делает это наполовину:

(?:^)(?:[^d][^e][^f])+\(

Оно не должно совпадать со строками с: (не соответствует открытой скобке, перед которой стоит def)

anything def anything(thing)
anyyything def anythinggg(thing)

Исопоставлять только строки как: (сопоставлять открытые скобки, которым предшествует что-либо, кроме def)

anything anything(thing)
anyyything anythinggg(thing)

Но возникает проблема, так как я (?:[^d][^e][^f])+, выражение работает только тогда, когда открывающая скобка (ему предшествует предложение, кратное длине 3:

enter image description here enter image description here

  1. https://regex101.com/r/ec0FgD/1- Живой пример

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Он не должен совпадать со строками с: (не совпадает с открытой скобкой, перед которой стоит def)

Вы можете использовать отрицательное утверждение lookahead при ^ startкаждой строки для проверки вашего состояния:

^(?![^\n(]*?def)[^\n(]*\(

См. демонстрацию на regex101

  • отрицательный класс [^\n(] соответствует любому символу, кроме новой строки и открывающей круглой скобки

  • , чтобы отбросить деталь до ( из соответствия, используйте \K для сброса: ^(?![^\n(]*?def)[^\n(]*+\K\(

  • используйте границы слова \b в начале / конце def, если необходимо сопоставить подстроку как слово

0 голосов
/ 01 июня 2018

В PCRE вы не можете использовать вид сзади переменной длины, но можете использовать глаголы (*SKIP)(*FAIL) для неудачного совпадения:

def[^(]*\((*SKIP)(*F)|\(

Обновленная демонстрация регулярных выражений

  • (*FAIL) ведет себя как ошибочное отрицательное утверждение и является синонимом для (?!)
  • (*SKIP) определяет точку, за пределами которой движку регулярных выражений не разрешается возвращаться при сбое субпаттерна позднее
  • (*SKIP)(*FAIL) вместе обеспечивают хорошую альтернативу ограничения, что вы не можете иметь вид сзади переменной длины в приведенном выше регулярном выражении.
...