Алгоритм Дейкстры предполагает, что пути могут только стать «более тяжелыми», так что если у вас есть путь от А до В с весом 3 и путь от А до С с весом 3, вы не можете добавить ребро и получить от A до B через C с весом менее 3.
Это предположение делает алгоритм быстрее, чем алгоритмы, которые должны принимать отрицательные веса.
Вы можете использовать просмотр :
>>> text = "I need help. I need 5.4 dollar."
>>> re.sub(r'(?<=\D)\.', '\n', text)
'I need help\n I need 5.4 dollar\n'
В этом случае (?<=\D)
утверждает, что символ перед литералом .
не является цифрой. [115 ]
Написание эффективных регулярных выражений начинается с формулировки того, что вам действительно нужно. В вашем случае это выглядит так, как будто вы хотите:
«Заменить все периоды символами новой строки, если только период не является частью числа».
И чтобы сделать это еще более точным, определим Что это означает, что точка является частью числа: это, вероятно, означает, что за ним непосредственно следует число, так что оно соответствует 5.4
, но также .4
в The average score of .4 was low.
, но не 4.
в 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
В этом конкретном примере вы можете использовать метасимвол regex \ b, чтобы соответствовать началу или концу слова (граница слова)
import re
text = "I need help. I need 5.4 dollar."
a = re.compile('\b(\.)')
print(a.sub('\n',text))