обработка ложных срабатываний регулярное выражение - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть регулярное выражение, отвечающее за сопоставление номеров отслеживания для USPS.Есть 2 выражения, сгруппированные следующим образом:

r'\b(9[0-9]{3} ?[0-9]{4} ?[0-9]{4} ?[0-9]{4} ?[0-9]{4} ?[0-9]{2}|9[0-9]{3} ?[0-9]{4} ?[0-9]{4} ?[0-9]{4} ?[0-9]{4} ?[0-9]{2} ?[a-z]{2} ?[0-9]{3} ?[0-9]{3} ?[0-9]{3} ?US)\b'

Это пример того, что я пытаюсь найти:

9270 1000 0000 0000 0000 00 EA 000 000 000 US

, хотя первая часть строки явно совпадаетпервое выражение, оно должно действительно соответствовать второму выражению, потому что это правильный формат.Первый шаблон соответствует, потому что половина строки удовлетворяет шаблону.

Каков наилучший сценарий для обработки этих типов «ложных срабатываний»?

1 Ответ

0 голосов
/ 29 ноября 2018

Первое замечание: [0-9] упрощается до \d в большинстве ситуаций - намного проще читать и писать.

Когда вы хотите чередовать два шаблона и точно более короткий соответствует другому до конца более короткого, вы можете поставить более длинный первым.То есть вместо:

\b(
  9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
  |
  9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2} ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US
)\b

(начальные пробелы и символы новой строки предназначены только для ясности группировки)

вы можете сделать

\b(
  9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2} ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US
  |
  9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
)\b

https://regex101.com/r/8CVhJ2/1

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

\b
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
(?: ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US)?
\b

https://regex101.com/r/8CVhJ2/2

Вы также можете упростить вышесказанное, повторив последовательные подшаблоны \d{4} ? в группе:

\b
9\d{3} ?(?:\d{4} ?){4}\d{2}
(?: ?[a-z]{2} ?(?:\d{3} ?){3}US)?
\b

все в одной строке:

\b9\d{3} ?(?:\d{4} ?){4}\d{2}(?: ?[a-z]{2} ?(?:\d{3} ?){3}US)?\b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...