Почему позитивный взгляд работает, а негативный - нет? - PullRequest
1 голос
/ 07 октября 2019

Прежде всего, регулярное выражение должно работать как для python, так и для PCRE (PHP). Я пытаюсь игнорировать, если за шаблоном регулярных выражений следует буква «х», чтобы отличать размеры от строк, таких как «число / число» в приведенном ниже примере:

dummy word 222/2334; Ø14 x Ø6,33/523,23 x 2311 mm

Отсюда япытается извлечь 222/2334, но не 6,33/523,23, поскольку эта часть фактически является частью измерений. До сих пор я придумал это регулярное выражение

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))(?=\s?x)

, которое может извлекать то, что я не хочу, чтобы оно извлекало, и выглядит как this . Если я изменю положительный прогноз на отрицательный, он захватывает их обоих, кроме последнего «3» из 6,33/523,23. Похоже это . Как я могу только захватить 222/2334? Что я тут не так делаю?

Желаемый вывод:

222/2334

Что я получил

222/2334 6,33/523,2

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Вы можете использовать это упрощенное регулярное выражение с отрицательным прогнозом:

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))\b(?![.,]?\d|\s?x)

Обновленная демонстрация RegEx

  • Важно использовать словограница в конце, чтобы избежать совпадения частичных чисел (причина совпадения вашего регулярного выражения с предыдущей цифрой)

  • Также включите [.,]?\d в условие отрицательного просмотра, чтобы совпадение не заканчивалось напозиция перед последней запятой.


Это более короткое (и более эффективное) регулярное выражение также может работать для OP:

(\d+(?:[,.]\d+)*)\s*\/\s*(\d+(?:[,.]\d+)*)\b(?![.,]?\d|\s?x)

RegEx Demo 2

1 голос
/ 07 октября 2019

Существует два варианта easy .

Первый параметр уродлив и длинен, но в основном сводит на нет положительное совпадение строки, за которым следует x, затем сопоставляет шаблоныбез него.

(?!PATTERN(?=x))PATTERN

Смотрите здесь регулярное выражение

(?!\d+(?:[,.]\d+)?\s?\/\s?\d+(?:[,.]\d+)?(?=\s?x))(\d+(?:[,.]\d+)?)\s?\/\s?(\d+(?:[,.]\d+)?)

Во втором варианте используются квантификаторы притяжений, но вы получитеиспользовать модуль regex вместо re в Python.

Смотрите здесь регулярное выражение

(\d+(?:[,.]\d+)?+)\s?\/\s?(\d+(?:[,.]\d+)?+)(?!\s?x)

Кроме того, я изменил ваш подшаблондо \d+(?:[,.]\d+)?. Это будет соответствовать одной или нескольким цифрам, а затем по выбору совпадать с . или ,, за которыми следуют одна или несколько цифр.

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