Regex - как исключить 4 di git число из более широкого шаблона numeri c - PullRequest
1 голос
/ 29 мая 2020

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

  • Найти любое выражение, которое будет числом от 4 до 6 цифр (независимо от позиции в строке)
  • Исключить из этого шаблона выражения, которые будут относиться к годам в этом веке (поэтому, начиная с 20 и за которыми следуют две цифры)

Так, например, я хотел бы сопоставить: 4149, 20259, 202046 , но хотел бы исключить 2019 год, поскольку он будет относиться к году, а не к коду, который я ищу.

В настоящее время я пробовал применить этот (только последнюю часть выражения): | \ d {4,6} ?! 20 \ d {2}) , но он работает неправильно. Я знаю, что выражения перед вертикальной чертой в порядке, и я заметил, что \ d {4,6} перестает работать, как только я добавляю "исключение" в этом случае, поэтому я предполагаю, что не использую?! должным образом. Могу я попросить совета по этому поводу?

Редактировать: Решено! Большое спасибо за немедленные ответы (я был действительно приятно удивлен, насколько быстро было несколько альтернативных решений). Извините, мне пришлось выбрать только один, все остальные можно было бы настраивать и использовать в соответствии с моими потребностями, я просто нашел этот наиболее привлекательным и адаптированным для моих нужд.

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

Если я не уверен, что границы слов лучше всего подходят для обозначения границ (возможно, \D лучше?), Вы можете попробовать:

\b(?!20\d\d\b)\d{4,6}\b

См. онлайн-демонстрацию


  • \b - Граница слова.
  • (?!20\d\d\b) - Отрицательный просмотр вперед: без литерала 20, за которым следуют две цифры и граница слова.
  • \d{4,6} - от четырех до шести цифр.
  • \b - границы слова.

Regular expression visualization

1 голос
/ 29 мая 2020

Вы можете использовать следующее регулярное выражение.

r'\b(?:20\d{3,4}|2[1-9]\d{2,4}|[1,3-9]\d{3,5})\b'

Demo

0 голосов
/ 29 мая 2020

Это должно работать:

[013-9][1-9]\d{2}|\d{5,6}

Соответствует всем 4 последовательностям di git, кроме тех, которые начинаются с 20, и всем 5 или 6 последовательностям di git

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...