Python Реализация Regex с использованием re.search - PullRequest
1 голос
/ 01 апреля 2020

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

  • Сокращение валюты ("USD", "CAD" или "GBP")
  • Ровно один пробел
  • Неотрицательное значение в формате, описанном ниже

Например:

"GBP     1,123"    should not match(too many spaces)
"GBP 1,123,412"    should match
"USD 0.10"         should match
"CAD 10.12333"      should not match as fractional part too long
"USD 012.12"        should not match (redundant leading zero)
"USD 10q"           should not match (redundant characters at the end)
"qUSD 10"           should not match (redundant characters at the beginning)
"ABC 10"            should not match (wrong currency)
"CAD 10"            should match
"CAD 10.00"            should match

Значение может быть целым числом (например, 10) или может иметь дробная часть, в этом случае мы разрешаем ровно две цифры после точки (например, 0.10). Кроме того, целочисленная часть должна быть в удобном формате: начиная с конца, каждая группа из трех цифр должна быть разделена запятой (например, 1,123,412). Начальные нули в целочисленной части недопустимы.

Регулярное выражение будет оцениваться с использованием re.search python. Можно предположить, что регулярное выражение не содержит новых строк

Я написал решение как re.search(r'^(USD|CAD|GBP)\s[0-9]+(\.[0-9][0-9]?)?) Но тесты для некоторых не проходят. Можете ли вы сообщить мне, где я сделал ошибку и исправить ее

1 Ответ

0 голосов
/ 01 апреля 2020

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

re.search(r'^(?:USD|CAD|GBP)\s(?:[1-9][0-9]{0,2}(?:,[0-9]{3})*|0)(?:\.[0-9]{1,2})?$', text)

или еще две альтернативы для Python 3.x:

re.match(r'(?:USD|CAD|GBP)\s(?:[1-9][0-9]{0,2}(?:,[0-9]{3})*|0)(?:\.[0-9]{1,2})?$', text) # only $ anchor is needed
re.fullmatch(r'(?:USD|CAD|GBP)\s(?:[1-9][0-9]{0,2}(?:,[0-9]{3})*|0)(?:\.[0-9]{1,2})?', text)

См. Демонстрационную версию regex . Обратите внимание, что для re.search обязательны якоря ^ и $, так как re.search ищет совпадения в любом месте строки. При re.match совпадение разрешено только в начале строки, поэтому ^ не обязательно и $ обязательно. При re.fullmatch вся строка должна соответствовать шаблону, поэтому якоря являются избыточными.

Детали регулярного выражения

  • ^ - начало строки
  • (?:USD|CAD|GBP) - группа без захвата, соответствующая USD, CAD или GBP
  • \s - один символ пробела
  • (?:[1-9][0-9]{0,2}(?:,[0-9]{3})*|0) - сопоставление группы без захвата
    • [1-9][0-9]{0,2}(?:,[0-9]{3})* - ненулевое значение di git, за которым следуют 0, 1 или 2 цифры, а затем 0 или более вхождений ,, за которыми следуют ровно три цифры
    • | - или
    • 0 - ноль ди git
  • (?:\.[0-9]{1,2})? - дополнительная группа без захвата соответствие ., а затем 1 или 2 цифры
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...