Regex - Найти числа между 2000 и 3000 - PullRequest
9 голосов
/ 28 января 2010

У меня есть необходимость искать все числа с 4 цифрами между 2000 и 3000.

Возможно, буквы до и после.

Я думал, что могу использовать [2000-3000]{4}, но не работает, почему?

спасибо.

Ответы [ 6 ]

25 голосов
/ 28 января 2010

Как насчет

^2\d{3}|3000$

Или, как указали Amarghosh & Bart K. & jleedev, чтобы соответствовать нескольким экземплярам

\b(?:2[0-9]{3}|3000)\b

Если вам нужно соответствовать a3000 или 3000a, но не 13000, вам нужно смотреть вперед и выглядеть как

(?<![0-9])(?:2[0-9]{3}|3000)(?![0-9])
9 голосов
/ 28 января 2010

Регулярные выражения редко подходят для проверки диапазонов, поскольку для диапазонов от 27 до 9076 включительно они становятся невероятно безобразными. Это можно сделать, но вам действительно лучше просто сделать регулярное выражение для проверки чисел, что-то вроде:

^[0-9]+$

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

Всего:

def isBetween2kAnd3k(s):
    if not s.match ("^[0-9]+$"):
        return false
    i = s.toInt()
    if i < 2000 or i > 3000:
        return false
    return true

Что проверяет конкретное регулярное выражение [2000-3000]{4}, это ровно четыре вхождения любого из следующих символов: 2,0,0,0-3,0,0,0 - другими словами, ровно четыре цифры взяты из 0-3.

С буквами до и после, вам нужно будет изменить регулярное выражение и проверить правильную подстроку, например:

def isBetween2kAnd3kWithLetters(s):
    if not s.match ("^[A-Za-z]*[0-9]{4}[A-Za-z]*$"):
        return false
    idx = s.locate ("[0-9]")
    i = s.substring(idx,4).toInt()
    if i < 2000 or i > 3000:
        return false
    return true

Кроме того, регулярное выражение для проверки диапазона от 27 до 9076 включительно было бы примерно таким отвратительным чудовищем:

^2[7-9]|[3-9][9-9]|[1-9][0-9]{2}|[1-8][0-9]{3}|90[0-6][0-9]|907[0-6]$

Я думаю, что это значительно менее читабельно, чем использование ^[1-9][0-9]+$, а затем проверка, находится ли оно между 27 и 9076, с помощью оператора if?

3 голосов
/ 28 января 2010

Гул хитрый. Тире - применяется только к символу непосредственно перед и после, так что то, что фактически соответствует вашему регулярному выражению, составляет ровно 4 символа от 0 до 3 включительно (т. Е. 0, 1, 2 и 3). например, 3210, 1230, 3333 и т. д ... Попробуйте выражение ниже.

(2[0-9]{3})|(3000)

2 голосов
/ 28 января 2010

Правильное регулярное выражение будет \b(2\d{3}|3000)\b. Это означает: соответствует символу «2», затем точно три цифры (это будет соответствовать любой от 2000 до 2999) или просто соответствует «3000». Есть несколько хороших руководств по регулярным выражениям:

  1. http://gnosis.cx/publish/programming/regular_expressions.html
  2. http://immike.net/blog/2007/04/06/the-absolute-bare-minimum-every-programmer-should-know-about-regular-expressions/
  3. http://www.regular -expressions.info /
2 голосов
/ 28 января 2010

Вот объяснение, почему и способы определения диапазонов: http://www.regular -expressions.info / numericranges.html

0 голосов
/ 28 января 2010

почему бы вам не проверить больше или меньше? это проще, чем регулярное выражение

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