Как заменить часть подстроки в Python?

У меня есть текст вроде

"Euro Style = $12,345,67, US Style = $12,345,67, $1,234"

и я хочу заменить строку на

Выход:

Euro Style = $12,345.67, US Style = $12,345.67, $1,234

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

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

add = "Euro Style = $12,345,67, US Style = $12,345,67, $1,234"
print(re.sub(r'([,][0-9]{2,}\B)+','.\2',add)) 

Я получаю неверный вывод как

Euro Style = $12.5,67, US Style = $12.5,67, $1.4

что вы получаете?

Francesco Montesano 13.04.2018 09:08

добавлен к вопросу

user3222101 13.04.2018 09:11

Попробуйте ,(?=\d{2}\b)

Gurmanjot Singh 13.04.2018 09:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

re.sub(r'(?<=\d),(?=\d{1,2}(?!\d))', r'.', s)

См. демонстрация регулярного выражения.

Подробности

  • (?<=\d) - цифра должна стоять прямо перед ...
  • , - запятая, после которой следует ...
  • (?=\d{1,2}(?!\d)) - 1 или 2 цифры (\d{1,2}), за которыми не следует другая цифра ((?!\d)).

Python тест:

import re
s = "Euro Style = $12,345,67, US Style = $12,345,67, $1,234, $12,124,345,456 $0,89  $12,345,678"
print(re.sub(r'(?<=\d),(?=\d{1,2}(?!\d))', '.', s))
# => Euro Style = $12,345.67, US Style = $12,345.67, $1,234, $12,124,345,456 $0.89  $12,345,678

Обратите внимание, что если ваши числа никогда не приклеиваются к _ или буквам, вы также можете использовать более простое регулярное выражение с границей слова:

(?<=\d),(?=\d{1,2}\b)
                  ^^ 

См. эта демонстрация регулярного выражения.

Или даже - если вам все равно, стоит цифра перед , или нет:

re.sub(r',(\d{1,2})\b', r'\1', s)

См. эта демонстрация регулярного выражения.

И, наконец, если вам нужно также поменять $12,212,12345678 на $12,212.12345678

re.sub(r',(\d{1,2}|\d{4,})\b', r'.\1', s)

Смотрите еще еще одна демонстрация регулярного выражения.

(\d{1,2}|\d{4,}) - это группа чередования, которая соответствует либо 1, либо 2 цифрам, либо более чем 4 цифрам, что позволяет исключить блоки из 3 цифр, за которыми следует граница слова.

Спасибо за объяснение! он не работает, когда моя строка "0,89 доллара", но я думаю, что могу это исправить ...

user3222101 13.04.2018 09:15

Он также не выполняется, если в строке содержится 12 345 678 долларов США. Последняя часть (\d+) соответствует любому количеству цифр.

KBN 13.04.2018 09:17

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

Wiktor Stribiżew 13.04.2018 09:35

Пытаться

re.sub(r',(\d{2}\D)', r'.\1', add)

{2,} обозначает 2 или более чисел. Поскольку вы хотите сопоставить ровно 2, вам нужно дать {2}. Использование \ D только для сопоставления чего-либо еще, кроме цифры. Надеюсь это поможет! -

спасибо, но это снова не удается для строки типа '1,234,567,89'

user3222101 13.04.2018 09:22

Просто понял, что это не будет совпадать, если в конце будет 0,89 доллара. Придется поменять \ D на \ B / \ b. Это опять же зависит от того, какие другие персонажи могут появиться.

KBN 13.04.2018 09:24

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