J'ai des chaînes telles que:
text.replace(r'(,\d{0,5},)','.........')
Sortie souhaitée:
SOME STRING 99,1234 FIRST STREET,9998887777,ABC SOME OTHER STRING,56789 SECOND STREET,6665554444,DEF ANOTHER STRING #88,4321 THIRD STREET,3332221111,GHI
Mon idée: utiliser l'expression régulière pour trouver des occurrences de 1 à 5 les chiffres, éventuellement précédés d'un symbole, qui sont entre deux virgules et non suivis d'un espace et de lettres, puis remplacés par cette correspondance sans la virgule précédente. Quelque chose comme:
text1 = ('SOME STRING,99,1234 FIRST STREET,9998887777,ABC') text2 = ('SOME OTHER STRING,56789 SECOND STREET,6665554444,DEF') text3 = ('ANOTHER STRING,#88,4321 THIRD STREET,3332221111,GHI')
3 Réponses :
Si vous utilisiez le module regex
au lieu de re
, alors peut-être:
import re str = "ANOTHER STRING,#88,4321 THIRD STREET,3332221111,GHI" print(re.sub(r',(?=#?\d+,\d+)', ' ', str))
Vous pourrez peut-être utiliser re
si vous êtes sûr qu'il n'y a pas d'autre sous-chaîne suivant le modèle dans l'anticipation.
import regex str = "ANOTHER STRING,#88,4321 THIRD STREET,3332221111,GHI" print(regex.sub(r'(?<!^.*,.*),(?=#?\d+,\d+)', ' ', str))
Alternative plus facile à lire si CERTAINES STRING, QUELQUES AUTRES STRING et ANOTHER STRING ne contiennent jamais de virgules:
text1.replace(",", " ", 1)
qui remplace simplement la première virgule par un espace
solution intelligente! mais parfois la première virgule ne doit pas être supprimée, lorsque les chiffres supplémentaires ne sont pas dans la chaîne, comme text2
Simple, mais efficace:
my_pattern = r""" (?:,) # Non-capturing group for single comma. (\W?\d{0,5},) # Capture zero or one non-ascii characters, zero to five numbers, and a comma """ # re.X compiles multiline regex patterns p = re.compile(my_pattern, flags = re.X) # This time we will use \1 to implement the first captured group p.sub(r" \1", text1) p.sub(r" \1", text2) p.sub(r" \1", text3)
Modèle secondaire avec groupe non capturant et compilation verbeuse:
my_pattern = r"(,)(\W?\d{0,5},)" p = re.compile(my_pattern) p.sub(r" \2", text1) # 'SOME STRING 99,1234 FIRST STREET,9998887777,ABC' p.sub(r" \2", text2) # 'SOME OTHER STRING,56789 SECOND STREET,6665554444,DEF' p.sub(r" \2", text3) # 'ANOTHER STRING #88,4321 THIRD STREET,3332221111,GHI'
Doit-il y avoir un espace sur la deuxième ligne après
OTHER STRING
?Une autre chaîne, une autre chaîne et une autre chaîne contiennent-elles des virgules? Travaillez-vous généralement avec un CSV ou est-ce que ceux-ci sont séparés par des virgules?