Регулярное выражение в Python

Цель. Учитывая число (оно может быть очень длинным, и оно больше 0), я хотел бы получить пять наименее значимых цифр, сбросив все 0 в конце этого числа.

Я попытался решить это с помощью регулярного выражения. Помог RegexBuddy. Я пришел к этому:

[\d]+([\d]{0,4}+[1-9])0* 

Но python не может скомпилировать это.

 >>> import re >>> re.compile(r"[\d]+([\d]{0,4}+[1-9])0*") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/re.py", line 188, in compile return _compile(pattern, flags) File "/usr/lib/python2.5/re.py", line 241, in _compile raise error, v # invalid expression sre_constants.error: multiple repeat 

Проблема заключается в «+» после «{0,4}», кажется, что она не работает в python (даже в версии 2.6)

Как написать рабочее регулярное выражение?

PS: Я знаю, что вы можете начать делиться на 10, а затем использовать остаток n% 100000 … но это проблема с регулярным выражением.

5 Solutions collect form web for “Регулярное выражение в Python”

Это регулярное выражение является очень излишним. Попробуй это:

 >>> import re >>> re.compile(r"(\d{0,4}[1-9])0*$") 

Вышеприведенное регулярное выражение предполагает, что число действительно (оно также будет соответствовать «abc 012345 0», например.) Если вам действительно нужна проверка того, что нет несимвольных символов, вы можете использовать это:

 >>> import re >>> re.compile(r"^\d*?(\d{0,4}[1-9])0*$") 

В любом случае, \d не обязательно должен находиться в классе символов, а квантификатор {0,4} не должен быть вынужден быть жадным (поскольку дополнительный + указывает, хотя, по-видимому, Python этого не признает).

Кроме того, во втором регулярном выражении \d является жадным, поскольку я считаю, что это улучшит производительность и точность. Я также сделал это «ноль или больше», поскольку я предполагаю, что это то, что вы хотите.

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

\ d {0,4} + является притяжательным квантификатором, поддерживаемым некоторыми регулярными выражениями, такими как .NET и Java. Python не поддерживает притяжательные кванторы.

В RegexBuddy выберите Python на панели инструментов вверху, а RegexBuddy скажет вам, что Python не поддерживает притяжательные квантификаторы. Символ «+» будет выделен красным цветом в регулярном выражении, а на вкладке «Создать» будет отображаться ошибка.

Если вы выберете Python на вкладке Use в RegexBuddy, RegexBuddy будет генерировать фрагмент исходного кода Python с регулярным выражением без притяжательного квантификатора и комментарий, указывающий на то, что удаление потенциального квантификатора может дать разные результаты. Вот код Python, который RegexBuddy генерирует с использованием регулярного выражения из вопроса:

 # Your regular expression could not be converted to the flavor required by this language: # Python does not support possessive quantifiers # Because of this, the code snippet below will not work as you intended, if at all. reobj = re.compile(r"[\d]+([\d]{0,4}[1-9])0*") 

Вероятно, вы выбрали такой аромат, как Java, на главной панели инструментов, а затем нажмите «Копировать регулярное выражение как строку Python». Это даст вам регулярное выражение Java, отформатированное как строка Pythong. Элементы в меню «Копировать» не преобразуют ваше регулярное выражение. Они просто форматируют его как строку. Это позволяет делать такие вещи, как форматирование регулярного выражения JavaScript как строки Python, поэтому ваш скрипт Python на стороне сервера может кормить регулярное выражение в клиентском JavaScript-коде.

Маленький наконечник. Я рекомендую вам протестировать с помощью reTest вместо RegExBuddy. Существуют разные механизмы регулярного выражения для разных языков программирования. ReTest ценен тем, что позволяет быстро тестировать строки регулярных выражений внутри самого Python. Таким образом, вы можете гарантировать, что вы проверили свой синтаксис с помощью механизма регулярных выражений Python.

Кажется, что ошибка состоит в том, что у вас есть два квантификатора подряд, {0,4} и +. Если «+» не должен быть буквальным здесь (что я сомневаюсь, поскольку вы говорите о цифрах), то я не думаю, что вам это нужно вообще. Если это не означает что-то другое в этой ситуации (возможно, жадность квантора {})? я бы попробовал

 [\d]+([\d]{0,4}[1-9])0* 

Если вы намеревались использовать оба квантификатора, то это может сработать

 [\d]+(([\d]{0,4})+[1-9])0* 

Но, учитывая вашу спецификацию проблемы, я сомневаюсь, что это то, что вы хотите.

Это мое решение.

 re.search(r'[1-9]\d{0,3}[1-9](?=0*(?:\b|\s|[A-Za-z]))', '02324560001230045980a').group(1) 

'4598'

  • [1-9] – номер должен начинаться с 1 – 9
  • \d{0,3} – 0 или 3 цифры
  • [1-9] – номер должен заканчиваться 1 или 9
  • (?=0*(:?\b|\s\|[A-Za-z])) – конечная часть строки должна быть сформирована из 0 и или \b , \s , [A-Za-z]
 
Interesting Posts for Van-Lav

Установка данных инструментария на естественном языке

Python: «неожиданный отступ», но отступы кажутся правильными и последовательными

Определение аргумента по умолчанию в качестве глобальной переменной

Flask / Werkzeug как подключить заголовок длины HTTP-содержимого к файлу

Сеть Caffe получает очень низкие потери, но очень плохая точность при тестировании

Pip install-cann't найти версию, которая удовлетворяет требованию

Удаление имен пользователей из фреймворка данных, который не отображается определенное количество раз?

Как использовать python mysqldb для вставки сразу нескольких строк

Python: Любой способ объявить постоянные параметры?

Python, Mechanize – запрос, запрещенный robots.txt, даже после set_handle_robots и add_headers

Python – конвертировать время в другой часовой пояс с am / pm

Могут ли устанавливать установки PP, не указанные в setup.py во время установки?

Обработка событий с помощью Jython & Swing

Загрузка файлов .ui в QtDesigner в PySide

нелинейный метод наименьших квадратов python

Python - лучший язык программирования в мире.