Написание эффективных регулярных выражений начинается с формулировки того, что вам действительно нужно. В вашем случае это выглядит так, как будто вы хотите:
"Заменить все периоды символами новой строки, если период не является частью числа."
И чтобы сделать это еще более точным, определив, что означает, что период является частью числа: это, вероятно, означает, что за ним непосредственно следует число, так что оно соответствует 5.4
, но также .4
в The average score of .4 was low.
, но не 4.
in She only counted a total of 4.
"Заменить все периоды символами новой строки, если за точкой сразу не следует цифра."
import re
text = '"I have .5 dollar. I need 5.4 dollar. But they only gave me 3."'
expression = re.compile(r'\.(?!\d)')
print(expression.sub('\n', text))
Вместо этого ваш пример \D(\.)
соответствовал следующему: «Совпадение с одним символом, который не является цифрой, за которым следует литерал .
», который вы не хотите заменить.
Новое выражение \.(?!\d)
соответствует «Соответствует литералу .
, но только если за ним не следует цифра». Он использует нечто, называемое негативным взглядом, подробнее об этом здесь https://www.regular -expressions.info / lookaround.html