RegEx, как отменить совпадение на основе персонажа в конкретной позиции - PullRequest
0 голосов
/ 08 октября 2018

Обратите внимание: я программирую на Python (версия 3.6), но также хотел бы перенести эти регулярные выражения в SAS.

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

54210      proc sort data=inds out=outds;

И строки, которые я НЕ ХОЧУ, будут выглядеть так:

33406     +%global  var1 var2 var3;

Ключ в том, что11-й символ будет «+», но слева всегда будет группа чисел, за которой следует группа пробелов, длина которых в конечном итоге составит 11 пробелов - , если это не строка% include,который я хочу исключить.

То, что у меня пока есть, таково:

^[0-9]{1,11} (?! {2,10}\+)

Это сработало, чтобы получить то, что я хочу именно из журналов, которые я тестировал, но это далеко не так.Самый простой выход - использовать это выражение:

^[0-9]{1,11} {3,10}

А затем добавить дополнительное условие, которое будет игнорировать строку, если 11-й символ - «+», но могу ли я сделать это в одном регулярном выражении?Я сталкивался с lookaheads / lookbehinds, работающими над этим, но проблема в том, что первая подобранная группа может различаться по длине, которая перемещается туда, где можно было бы ожидать «+» - так есть ли способ, которым я могу сопоставить группу в наборедлина и затем отменить совпадение, если за ним следует символ?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вместо фильтрации регулярных выражений вы рассматривали возможность установки соответствующих параметров ведения журнала в своем коде SAS, чтобы строки из операторов% include не регистрировались в первую очередь?т.е. установите option nosource2; в начале вашей программы.

Документация:

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000279225.htm

0 голосов
/ 09 октября 2018

Вы можете использовать

^\d+ +(?<=.{11})

См. Демоверсию regex

Подробности

  • ^- начало строки
  • \d+ + - 1+ цифр, а затем 1+ пробелов
  • (?<=.{11}) - положительная проверка на поиск сзади, которая требует ровно 11 символов непосредственно слева от текущего местоположения.
0 голосов
/ 09 октября 2018

Вы можете использовать ^[0-9\s]{,11}\+ для удаления нежелательных журналов.Он соответствует до 11 цифр и / или пробелов, за которыми следует + (что, по-видимому, является шаблоном для нежелательных предметов).В случае, если вы хотите отменить совпадение, вы можете просто сделать not re.match(...).

Используя упреждающий просмотр, вы можете отказаться от строк, которые содержат + в их первых 11 символах, а затем соответствовать желаемому шаблону: ^(?=[^+]{11})[0-9]{1,11} {3,10}.

(?=      # Look ahead and assert equal that ...
   [^+]  # ... anything but a plus ...
   {11}  # ... matches the following 11 characters.
)
...