Проблема вставки запятых в числах с помощью регулярных выражений: Python - PullRequest
0 голосов
/ 20 января 2019

Я изучаю lookahead и lookbehind в регулярных выражениях и пытаюсь применить запятые к числу между каждыми 3 цифрами.Я застрял здесь:

text = "The population of India is 1300598526 and growing."
pattern = re.compile(r'\b(?<=\d)(?=(\d\d\d)+\b)')
line = re.sub(pattern, r',', text)
print(line)

ожидаемый вывод:

"The population of India is 1,300,598,526 and growing"

фактический вывод None.Шаблон не совпадает.Я попытался поиграть с шаблоном и обнаружил, что ведущая \b является виновником.Шаблон прекрасно работает без этого.Почему это так?Просьба уточнить.

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

1 Ответ

0 голосов
/ 20 января 2019

Ваше регулярное выражение начинается с \b(?<=\d) и использует границу слова .Эта позиция будет соответствовать только в конце 1300598526.Граница слова не совпадает между цифрами, поэтому часть, следующая за (?=(\d\d\d)+\b), не может совпадать.

Один из способов решения этой проблемы заключается в разделении пробела для получения слов.Затем сопоставьте каждый элемент и проверьте, состоит ли он из 4 или более цифр \A\d{4,}\Z и добавьте запятую после 3 цифр, используя:

\d(?=(?:\d{3})+(?!\d))

Объяснение

  • \d Совпадение с цифрой
  • (?= положительный прогноз, чтобы подтвердить, что справа -
    • (?:\d{3})+ повторение наборов из 3 цифр
    • (?!\d) отрицательныйвзгляд вперед, чтобы утверждать, что справа не цифра
  • ) Закрыть положительный прогноз

Например:

import re

text = "The population 12test1234 of India is 1300598526 and growing."
pattern = re.compile(r"\d(?=(?:\d{3})+(?!\d))")
subst = r"\g<0>,"

res = map(lambda x: re.sub(pattern, subst, x) if re.match(r"\A\d{4,}\Z", x) else x, text.split(' '))
print (" ".join(res))

Результат

The population 12test1234 of India is 1,300,598,526 and growing.

См. Демонстрационную версию Regex | Python demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...