Как заменить одно письмо, не подставляя другие? - PullRequest
0 голосов
/ 16 января 2019

Как заменить определенную букву в определенном месте, не подставляя другую ту же букву? Например:

text = `"I need help. I need 5.4 dollar."`

Я пытался:

a = re.compile('\D(\.)')
print(a.sub('\n',text))

Однако на выходе было

"I need hel\n I need 5.4 dolla\n"

Как я могу получить вывод

"I need help\n I need 5.4 dollar\n"

Ответы [ 3 ]

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

В этом конкретном примере вы можете использовать метасимвол regex \ b для соответствия начала или конца слова (границы слова)

import re

text = "I need help. I need 5.4 dollar."

a = re.compile('\b(\.)')
print(a.sub('\n',text))
0 голосов
/ 16 января 2019

Написание эффективных регулярных выражений начинается с формулировки того, что вам действительно нужно. В вашем случае это выглядит так, как будто вы хотите:

"Заменить все периоды символами новой строки, если период не является частью числа."

И чтобы сделать это еще более точным, определив, что означает, что период является частью числа: это, вероятно, означает, что за ним непосредственно следует число, так что оно соответствует 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

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

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

>>> 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) утверждает, что символ перед литералом . не является цифрой.

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