Регулярное выражение для соответствия менее 500 футов с десятичными разрядами в строке - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь использовать регулярные выражения, чтобы определить, содержит ли строка значение менее 500 футов.Важно отметить, что существуют некоторые ключевые ограничения и предположения для сопоставления:

  • Можно предположить, что запятые были удалены.Десятичные числа гарантированно равны ., а не ,
  • Невозможно предположить, что числовому значению предшествует пробел.
  • Можно предположить, что "футы" будут записаны как "футы" или "футов "
  • Может принимать нижний регистр
  • Десятичные знаки могут быть любой длины
  • Между числом и словом" футов "или" футов "или" футов "может быть любое число

Мои попытки на данный момент:

Попытка 1

\b[1-4]{0,1}[0-9]{1,2}(\.[0-9]{1,}}){0,1} {0,}(ft|feet)\b

Это было хорошо, но не смогло учесть десятичные дроби и соответствует значениям, таким как 1000.5 футов(соответствует «5 футов»)

Попытка 2

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

(?<!(\.|[0-9]))([1-4]{0,1}[0-9]{1,2}(\.[0-9]{1,}}){0,1} {0,}(ft|feet))\b

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

Буду признателен за любую помощь в понимании, где я ошибаюсь!

Тестовые случаи:

  • "1 фут в высоту" - соответствует
  • "1 фут в высоту" - соответствует
  • "1,1 фута в высоту" - соответствует
  • "Он 6 футов" -соответствует
  • "499,555 футов" - соответствует
  • "Он 2 метра" - нет совпадений
  • "500 футов" - нет совпадений
  • «Здание высотой 1000,405 футов» - не соответствует

1 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать

r"(?<!\d\.)(?<!\d)(?:[1-9]|[1-9]\d|[1-4]\d\d)(?:\.\d+)?\s*f(?:ee)?t\b"

См. Демоверсию regex

Подробности

  • (?<!\d\.)(?<!\d)- два отрицательных вида, которые следят за тем, чтобы непосредственно перед текущим местоположением не было цифры + точка или просто цифра
  • (?:[1-9]|[1-9]\d|[1-4]\d\d) - число
    • [1-9] - от 1 до 9
    • [1-9]\d - от 10 до 99
    • [1-4]\d\d - 100 до 499
  • (?:\.\d+)? - необязательная группа без захвата, соответствующая необязательной последовательности точек и затем 1+ цифр
  • \s* - 0+ пробелов
  • f(?:ee)?t - ft или feet (но не fet)
  • \b - граница слова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...