2
votes

Remplacer la chaîne Python par une variable de substitution regex

J'ai la chaîne suivante, où la sous-chaîne 2.5 été mal formée: 'It costs 2. 5. That is a lot.'

Comment supprimer l'espace entre le 2. et le 5 ?

J'ai essayé:

s = 'It costs 2. 5. That is a lot.'
s = s.replace('. ', '.')
print(s) # It costs 2.5.That is a lot.

Cependant, cela supprime également l'espace correctement placé entre le 5. et le T Je pense que je recherche une variable de substitution de regex de style sed, comme s/\. \([0-9]\)/.\1/g . Comment faire cela en Python?


0 commentaires

3 Réponses :


2
votes

Que dis-tu de ça:

import re

s = 'It costs 2. 5. That is a lot.'
s = re.sub(r"(?<=\d\.)\s+(?=\d)", "", s)

Comme on le voit ici sur regex101.com

Explication

J'utilise des lookbehinds et lookaheads positifs dans regex, qui indiquent à l'expression régulière de correspondre à un ou plusieurs espaces \s+ qui sont précédés d'un chiffre et d'un point (donnés par (?<=\d\.) ), Et suivis par un chiffre (donné par (?=\d) )

Voici un lien pour en savoir plus sur les lookaheads et lookbehinds . Ils sont incroyablement utiles dans de nombreux problèmes, je vous suggère donc d'en savoir plus sur eux.


Implémentation Python

(?<=\d\.)\s+(?=\d)


0 commentaires

1
votes

Vous pouvez utiliser une regex:

>>> import re
>>> re.sub("(\d+). (\d+)", "\g<1>.\g<2>", s)
'It costs 2.5. That is a lot.'


0 commentaires

1
votes

Dans le cas où la chaîne après elle peut commencer par un chiffre, vous pouvez également faire correspondre le point après le deuxième chiffre.

Si vous ne souhaitez pas faire correspondre les nouvelles lignes entre les deux, vous pouvez faire correspondre tous les caractères d'espacement sans retour à la ligne.

It costs 2.5. That is a lot.
It costs 2. 5 items, that is a lot.

Explication

  • \b Une limite de mot
  • (\d+\.) Capturez le groupe 1 , faites correspondre plus de 1 chiffres et un point
  • [^\S\r\n]+ Match 1+ caractères d'espace blanc sans retour à la ligne
  • (\d+\.) Capturez le groupe 2 , faites correspondre 1+ chiffres et un point suivant

Démo Regex | Démo Python

Dans le groupe de remplacement, utilisez le groupe 1 et le groupe 2.

Par exemple

import re
s = ("It costs 2. 5. That is a lot.\n"
    "It costs 2. 5 items, that is a lot.")
pattern = r"\b(\d+\.)[^\S\r\n]+(\d+\.)"
print(re.sub(pattern, r"\1\2", s))

Production

\b(\d+\.)[^\S\r\n]+(\d+\.)


0 commentaires