1
votes

Remplacer le symbole avant la correspondance à l'aide de regex en Python

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


2 commentaires

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?


3 Réponses :


1
votes

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


0 commentaires

0
votes

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


1 commentaires

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



0
votes

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'


0 commentaires