/ / Python Regex - Trouver des nombres avec une virgule dans une chaîne - python, regex

Python Regex - Trouvez des nombres avec une virgule dans une chaîne - python, regex

Je pourrais avoir une ficelle:

"Foo Bar, FooTown, $100,00"

Maintenant, je dois diviser cette chaîne par une virgule, mais cela serait mal divisé, comme le $100,00 contient aussi une virgule.

Donc, je veux d'abord regarder dans la chaîne, y a-t-il des nombres avec une virgule, et si c'est le cas, remplacez la virgule par un point final. donc ça ressemble à:

"Foo Bar, FooTown, $100.00"

MODIFIER:

Il y aura toujours de petits nombres, il n’y aura pas plus d’un , ou ., mais cela pourrait être 1 $ 10 $ 100 $ 1000

La chaîne peut avoir ou non des espaces avant la ,

Ceci est un message SMS.

Réponses:

7 pour la réponse № 1

Vous pouvez utiliser

>>> re.sub(r"(d),(d)", r"1.2", "Foo Bar, FooTown, $100,00")
"Foo Bar, FooTown, $100.00"

2 pour la réponse № 2

Vous pouvez également utiliser des expressions négatives ... ces énormes oublis dans les mécanismes d’expression régulière super puissants de Python ...

Vous pouvez faire une expression régulière pour divisé par des virgules qui ne sont pas précédées d'un chiffre ou suivies d'un chiffre.

#!/usr/bin/env python

import re
samples=[
"Foo Bar, FooTown, $100,00",
"$100,00, Foo Bar, FooTown",
"Foo Bar, $100,00, FooTown",
"$100,00, Foo Bar, FooTown,",
]

myRegex=re.compile(",(?!d)|(?<!d),")

for sample in samples:
print "%s sample splitted: %s (%s items)" % (sample, myRegex.split(sample), len(myRegex.split(sample)))

Les sorties:

Foo Bar, FooTown, $100,00 sample splitted: ["Foo Bar", " FooTown", " $100,00"] (3 items)
$100,00, Foo Bar, FooTown sample splitted: ["$100,00", " Foo Bar", " FooTown"] (3 items)
Foo Bar, $100,00, FooTown sample splitted: ["Foo Bar", " $100,00", " FooTown"] (3 items)
$100,00, Foo Bar, FooTown, sample splitted: ["$100,00", " Foo Bar", " FooTown", ""] (4 items)

Je suis très désolé pour les gars qui ont développé le module en Python ... j’ai vu ce genre de look très peu utilisé.


1 pour la réponse № 3

Un RegEx remplace le motif (d),(d) avec 1.2 marchera. le d correspond à n’importe quel chiffre, et les parenthèses autour signifient que le numéro sera mémorisé et 1 correspondra au premier et 2 correspondra à la deuxième.


1 pour la réponse № 4

Plutôt que de réparer vos données, pourquoi ne pas réparer votre scission?

>>> import re
>>> s = "Foo Bar, FooTown, $100,00"
>>> re.split(r"(?<!d),|,(?!d)", s)
["Foo Bar", " FooTown", " $100,00"]

Cela utilise des assertions négatives d'anticipation et d'anticipation pour s'assurer que la virgule n'est pas entourée de chiffres.

modifier: Changé l'expression régulière de r"(?<!d),(?!d)" à r"(?<!d),|,(?!d)" pour gérer correctement les chaînes telles que "$ 100,00, Foo Bar, FooTown". Merci à BorrajaX pour avoir signalé mon erreur dans les commentaires.