1
votes

Comment remplacer tous les espaces dans une chaîne si les espaces sont entourés de guillemets en Python?

J'ai une liste l.

print (l)
# ["This is","'the|space|first|space|'string","and 'it|space|is|space|'good"]

Je veux remplacer tous les espaces par "| space |" dans les chaînes qui sont dans les s.

l = ["This is","'the first 'string","and 'it is 'good"]

Je ne peux pas utiliser une boucle for dans une boucle for et utiliser directement .replace () car les chaînes ne sont pas modifiables p >

TypeError: l'objet 'str' ne prend pas en charge l'attribution d'éléments

J'ai vu les questions ci-dessous et aucune d'entre elles ne m'a aidé.

Remplacement de l'élément string dans la boucle for Python (3 réponses)

Exécuter la méthode replace () dans une boucle for? (3 réponses)

Remplacez les chaînes en utilisant List Comprehensions (7 réponses)

J'ai envisagé d'utiliser re.sub mais je ne peux pas penser à une expression régulière appropriée qui fasse le travail.


1 commentaires

Je suis à peu près sûr que regex ne fonctionnera pas dans cette situation. Je pense qu'il serait plus facile de faire quelque chose comme diviser la chaîne en utilisant les guillemets comme séparateurs, puis la substitution d'une chaîne.


3 Réponses :


1
votes

Je pense avoir résolu votre problème de remplacement avec regex. Vous devrez peut-être peaufiner un peu plus l'extrait de code donné en fonction de vos besoins.

Si j'ai bien compris la question, l'astuce consistait à utiliser une expression régulière pour trouver le bon espace à remplacer.

import re

l = ["This is","'the first 'string","and 'it is 'good"]

#declare output

for k in l:
    match = re.findall(r"\'(.+?)\'", k)
    if not match:
        #append k itself to your output
    else:
        p = (str(match).replace(' ', '|space|'))
        #append p to your output

Placement du code squelette pour votre référence:

match = re.findall(r"\'(.+?)\'", k) #here k is an element in list.

Je ne l'ai pas encore testé, mais cela devrait fonctionner. Faites-moi savoir si vous rencontrez des problèmes avec cela.


0 commentaires

1
votes

Cela fonctionne pour moi:

>>> def replace_spaces(str) :
...     parts = str.split("'")
...     for i in range(1,len(parts),2) :
...         parts[i] = parts[i].replace(' ', '|')
...     return "'".join( parts )
... 
>>> [replace_spaces(s) for s in l]
['This is', "'the|first|'string", "and 'it|is|'good"]
>>> 


1 commentaires

Merci pour la solution simple! Je ne peux pas croire que je n'y ai pas pensé.



1
votes

Utilisation de regex text-munging :

['This is', "'the|space|first|space|'string", "and 'it|space|is|space|'g
ood"]

Sortie:

import re

l = ["This is","'the first 'string","and 'it is 'good"]

def repl(m):
  return m.group(0).replace(r' ', '|space|')

l_new = []
for item in l:
  quote_str = r"'.+'"
  l_new.append(re.sub(quote_str, repl, item))


print(l_new)

La logique complète est essentiellement:

  1. Parcourez les éléments de l .
  2. Recherchez la chaîne entre guillemets simples . Passez cela à la fonction repl .
  3. Fonction repl J'utilise un simple replace pour remplacer les espaces par | space | .

Référence pour text-munging => https: //docs.python.org/3/library/re.html#text-munging


0 commentaires