У меня есть текст вроде
"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





Вы можете использовать
re.sub(r'(?<=\d),(?=\d{1,2}(?!\d))', r'.', s)
См. демонстрация регулярного выражения.
Подробности
(?<=\d) - цифра должна стоять прямо перед ..., - запятая, после которой следует ...(?=\d{1,2}(?!\d)) - 1 или 2 цифры (\d{1,2}), за которыми не следует другая цифра ((?!\d)).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 доллара", но я думаю, что могу это исправить ...
Он также не выполняется, если в строке содержится 12 345 678 долларов США. Последняя часть (\d+) соответствует любому количеству цифр.
Я обновил ответ, добавив кучу решений, чтобы также исправить потенциальные проблемы в других крайних случаях.
Пытаться
re.sub(r',(\d{2}\D)', r'.\1', add)
{2,} обозначает 2 или более чисел. Поскольку вы хотите сопоставить ровно 2, вам нужно дать {2}. Использование \ D только для сопоставления чего-либо еще, кроме цифры. Надеюсь это поможет! -
спасибо, но это снова не удается для строки типа '1,234,567,89'
Просто понял, что это не будет совпадать, если в конце будет 0,89 доллара. Придется поменять \ D на \ B / \ b. Это опять же зависит от того, какие другие персонажи могут появиться.
что вы получаете?