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?
3 Réponses :
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
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.
(?<=\d\.)\s+(?=\d)
Vous pouvez utiliser une regex:
>>> import re >>> re.sub("(\d+). (\d+)", "\g<1>.\g<2>", s) 'It costs 2.5. That is a lot.'
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 suivantDans 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+\.)