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






Если вы хотите понять процесс, я могу просто вам его объяснить. Я не знаю, делает ли это регулярное выражение то, что вы хотите, или нет ..
. - это специальный символ в регулярном выражении, означающий любой символ. Но здесь мы хотим использовать символ точки. В регулярном выражении это можно сделать, используя экранирующий символ \, например \.. Итак, использование . означает любой символ, а использование \. означает точку.\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) Он просто печатает целые числа без каких-либо изменений, моя реализация неверна?
Ага, я понял. Вы используете re.sub, поэтому используйте это регулярное выражение вместо (\d*\.\d\d[1-9]?).*
Спасибо, сработало.! Но я не понимаю почему! это (\ d * \. \ d \ d [1-9]?) имело смысл для меня, но это (\ d * \. \ d \ d [1-9]?). * - нет. Я действительно ценю твою помощь.
@MohamedAlmahmood принимая ответ
Если вы хотите использовать первое регулярное выражение, вы можете написать что-то вроде этого: p = re.findall(r"(\d*\.\d\d[1-9]?)", p)[0] вместо `p = re.sub (r" (\ d * \. \ D \ d [1-9]?) ", R" \ 1 ", п)`
Я не понимаю. Почему нам нужно было поставить. * В конце этого (\ d * \. \ D \ d [1-9]?). *, Чтобы он работал? Спасибо за терпеливость.
Извини, @MohamedAlmahmood, что ответил слишком поздно, я совсем забыл. Когда мы использовали следующее регулярное выражение (\d*\.\d\d[1-9]?) с re.sub() над определенным числом, например 3.141500002, функция заменяет часть 3.141 на себя, что заставляет нас чувствовать, что она ничего не сделала. Итак, я изменил регулярное выражение на (\d*\.\d\d[1-9]?).*, чтобы соответствовать целому числу, а затем заменил его первой группой, которой является 3.141. И этого не происходит с re.find, потому что эта функция возвращает нужное нам число и не заменяет ничего из исходного числа.
\1обозначает группу 1