3
votes

Comment substituer une certaine lettre sans en substituer d'autres?

Comment remplacer une certaine lettre à un certain endroit sans remplacer l'autre même lettre? Par exemple:

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

J'ai essayé:

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

Cependant, le résultat était

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

Comment puis-je obtenir la sortie de

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


1 commentaires

re.sub (r '(? <= \ D) \.', '\ n', texte)


3 Réponses :


2
votes

Vous pouvez utiliser une lookback :

>>> 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'

Dans ce cas, (? affirme que le caractère devant un littéral . n'est pas un chiffre.


0 commentaires

0
votes

Pour cet exemple particulier, vous pouvez utiliser le métacaractère regex \ b pour faire correspondre le début ou la fin d'un mot (limite de mot)

import re

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

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


0 commentaires

1
votes

L'écriture d'expressions régulières efficaces commence par la formulation de ce dont vous avez vraiment besoin. Dans votre cas, il semble que vous vouliez:

"Remplacer tous les points par des symboles de saut de ligne, sauf si le point fait partie d'un nombre."

Et pour rendre cela encore plus précis, définir de quoi il s'agit signifie qu'un point fait partie d'un nombre: cela signifie probablement qu'il est suivi directement d'un nombre, de sorte qu'il correspond à 5.4 , mais aussi à .4 dans Le score moyen de 0,4 était faible. , mais pas 4. dans Elle n'a compté qu'un total de 4.

"Remplacer toutes les périodes avec des symboles de retour à la ligne, sauf si le point est immédiatement suivi d'un chiffre. "

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))

À quoi correspond votre exemple \ D (\.) à la place était: "Correspond à un seul caractère qui n'est pas un chiffre, suivi d'un littéral . ", ce qui n'est pas ce que vous vouliez remplacer.

Les nouvelles expressions \ . (?! \ d) correspond à "Correspond à un littéral. , mais uniquement s'il n'est pas suivi d'un chiffre." Il utilise quelque chose appelé lookahead négatif, plus à ce sujet ici https://www.regular-expressions.info /lookaround.html


0 commentaires