Шаблон замены в python (re.sub ())

Вопрос

Шаблон замены в python (re.sub ())

Может кто-нибудь объяснить мне процесс следующего re.sub().

Я думаю, что процесс выглядит следующим образом:

найдите ".", затем найдите цифру, затем найдите другую цифру, которая находится между 1 и 9. Теперь я потерялся. Для чего стоит вопросительный знак? Что делает \d*? Почему в этом случае нам нужно использовать регулярное выражение с необработанной строкой?

\1 обозначает группу 1
Grijesh Chauhan 06.12.2018 07:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
685
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите понять процесс, я могу просто вам его объяснить. Я не знаю, делает ли это регулярное выражение то, что вы хотите, или нет ..

  • Сначала . - это специальный символ в регулярном выражении, означающий любой символ. Но здесь мы хотим использовать символ точки. В регулярном выражении это можно сделать, используя экранирующий символ \, например \.. Итак, использование . означает любой символ, а использование \. означает точку.
  • \d представляет любую цифру и действует точно так же, как [0-9]
  • Когда вы использовали [1-9], к тому времени вы указали, что нужно получать числа от 1 до 9, что означает, что ноль исключен.
  • Мы можем использовать звездочку *, чтобы выбрать ноль или более символов. В отличие от +, который используется для выбора одного или нескольких символов. Таким образом, использование \d* означает любые последовательные цифры из [0-9] или их отсутствие.
  • ? используется для обозначения с использованием только одного символа или ни одного. Итак, использование [1-9]? означает попытку найти только одну цифру от 1 до 9 ЕСЛИ НАЙДЕН.
  • Скобка () используется для группировки всего регулярного выражения в один вывод.

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

ЗАМЕТКА:

Я думаю, что регулярное выражение, которое вы написали в вопросе, неверно. Думаю, для получения того же результата должен быть (\d*\.\d\d[1-9]?) следующим образом. Я попытаюсь объяснить это регулярное выражение, используя это число 3.141500012. \d*\. означает найти любое количество цифр, которые могут быть найдены перед точкой, которая соответствует 3.. затем после этого \d\d соответствует двум цифрам после точки, которые являются 14. Наконец, [1-9]? соответствует любой цифре от 1 до 9, если найден, что соответствует 1 в нашем примере.

Большое спасибо за подробный ответ. Ваш код имеет смысл, однако, когда я его тестировал, он не работал или, возможно, я что-то делаю не так. price = ["3.141500002", "12.125", "51.500"] для p в ценах: print ("Before ->", p) p = re.sub (r "(\ d * \. \ d \ d [ 1-9]?) ", R" \ 1 ", p) print (" After -> ", p) Он просто печатает целые числа без каких-либо изменений, моя реализация неверна?

Mohamed Almahmood 06.12.2018 08:16

Ага, я понял. Вы используете re.sub, поэтому используйте это регулярное выражение вместо (\d*\.\d\d[1-9]?).*

Anwarvic 06.12.2018 08:26

Спасибо, сработало.! Но я не понимаю почему! это (\ d * \. \ d \ d [1-9]?) имело смысл для меня, но это (\ d * \. \ d \ d [1-9]?). * - нет. Я действительно ценю твою помощь.

Mohamed Almahmood 06.12.2018 08:32

@MohamedAlmahmood принимая ответ

Grijesh Chauhan 06.12.2018 08:48

Если вы хотите использовать первое регулярное выражение, вы можете написать что-то вроде этого: p = re.findall(r"(\d*\.\d\d[1-9]?)", p)[0] вместо `p = re.sub (r" (\ d * \. \ D \ d [1-9]?) ", R" \ 1 ", п)`

Anwarvic 06.12.2018 08:48

Я не понимаю. Почему нам нужно было поставить. * В конце этого (\ d * \. \ D \ d [1-9]?). *, Чтобы он работал? Спасибо за терпеливость.

Mohamed Almahmood 06.12.2018 09:02

Извини, @MohamedAlmahmood, что ответил слишком поздно, я совсем забыл. Когда мы использовали следующее регулярное выражение (\d*\.\d\d[1-9]?) с re.sub() над определенным числом, например 3.141500002, функция заменяет часть 3.141 на себя, что заставляет нас чувствовать, что она ничего не сделала. Итак, я изменил регулярное выражение на (\d*\.\d\d[1-9]?).*, чтобы соответствовать целому числу, а затем заменил его первой группой, которой является 3.141. И этого не происходит с re.find, потому что эта функция возвращает нужное нам число и не заменяет ничего из исходного числа.

Anwarvic 19.12.2018 13:20

Другие вопросы по теме