Регулярное выражение для сопоставления чисел, конечных диапазонов и бесконечных диапазонов (например,> = 9) - PullRequest
1 голос
/ 14 ноября 2009

Что может быть регулярным выражением для следующего типа строки

например. 1, 2-3, 4..5, <6, <= 7,> 8,> = 9 Здесь я использую операторы equals, range (-), sequence (..) и больше / равно операторам для чисел меньше 100. Эти числа разделяются запятой.

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

  • Атул

Ответы [ 3 ]

3 голосов
/ 14 ноября 2009

Как насчет этого:

^(\d+(-|\.\.)|[<>]=?)?\d+$

Пример использования Python:

>>> import re
>>> pattern = '^(\d+(-|\.\.)|[<>]=?)?\d+$'
>>> for s in '1, 2-3, 4..5, <6, <=7, >8, >=9'.split(','):
...     print(re.match(pattern, s.strip()).group(0))
... 
1
2-3
4..5
<6
<=7
>8
>=9

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

Как работает регулярное выражение:

  • Обратите внимание, что каждая действительная строка заканчивается одной или несколькими цифрами, таким образом, \d+$.
  • До этого может быть или не быть чего-то, таким образом, ^(...)?\d+$.
  • Эти префиксы являются либо началом диапазона, либо сравнением:
    • \d+(-|\.\.) соответствует номеру, за которым следует тире или два периода.
    • <=? соответствует "<", а также "<=". Аналогично для >=?. Мы можем сократить это до [<>]=?.
  • Комбинируя эти два варианта, используя трубу (|), которая означает выбор, мы получаем

    ^(\d+(-|\.\.)|[<>]=?)?\d+$
    
0 голосов
/ 14 ноября 2009

Вы должны полностью использовать инструмент регулярных выражений, такой как regex buddy.

Вы пытаетесь проверить, что ваша строка обычно выглядит как образец?

1, 2-3, 4..5, <6, <=7, >8, >=9

соответствует

\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*(,\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*)*

Проще разделить на ,, а затем сопоставить каждую часть с

\s*(\d+|\d+-\d+|\d+\.\.\d+|[<>]=?\d+)\s*

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

Вы можете сжать это до более трудного для чтения:

\s*((\d+(-|\.\.)|[<>]=?)?\d+)\s*

Если вы хотите, чтобы все ваши цифры были только 1-2 цифрами, измените все \d+ на \d{1,2} или \d\d?

0 голосов
/ 14 ноября 2009

Попробуйте это выражение:

^(?:\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)(?:,\s*\d+(?:(?:\.\.|-)\d+)?|[<>]=?\d+)*$

Состоит из чередования

  • \d+(?:(?:\.\.|-)\d+)? для числа, за которым следует необязательное выражение для диапазона или последовательности, и
  • [<>]=?\d+ для неравенства.

Это повторяется во второй части с запятой и необязательным пробелом для списка.

А для условия, допускающего только числа меньше 100, вы можете заменить \d+ на [1-9]\d для 1,99 или (?:0|[1-9]\d) для 0..99.

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