Comment puis-je supprimer les premier et dernier guillemets doubles?

102

Je souhaite supprimer les guillemets doubles de:

string = '"" " " ""\\1" " "" ""'

obtenir:

string = '" " " ""\\1" " "" "'

J'ai essayé d'utiliser rstrip, lstripet , strip('[^\"]|[\"$]')mais cela n'a pas fonctionné.

Comment puis-je faire ceci?

Walapa
la source
5
Les bonnes réponses sont données ci-dessous. En ce qui concerne votre approche avec strip, veuillez noter que a) cette méthode ne prend pas une expression régulière comme argument, b) l'expression régulière que vous avez fournie n'aurait pas fonctionné de toute façon et c) cette méthode supprime tous les caractères adjacents, pas seulement un, donc vous auriez perdu deux guillemets avec .strip('"').
Tim Pietzcker

Réponses:

189

Si les guillemets que vous souhaitez supprimer sont toujours "en premier et en dernier" comme vous l'avez dit, vous pouvez simplement utiliser:

string = string[1:-1]

houbysoft
la source
Celui ci-dessous est plus sûr!
R Claven
93

Si vous ne pouvez pas supposer que toutes les chaînes que vous traitez ont des guillemets, vous pouvez utiliser quelque chose comme ceci:

if string.startswith('"') and string.endswith('"'):
    string = string[1:-1]

Éditer:

Je suis sûr que vous venez d'utiliser stringcomme nom de variable pour exemplification ici et dans votre vrai code, il a un nom utile, mais je me sens obligé de vous avertir qu'il existe un module nommé stringdans les bibliothèques standard. Il n'est pas chargé automatiquement, mais si jamais vous utilisez, import stringassurez-vous que votre variable ne l'éclipse pas.

tgray
la source
1
Si la chaîne est '"' (juste un guillemet double), cela supprimera le caractère unique. Je pense que ce n'est probablement pas ce qui est souhaité, probablement Walapa voulait supprimer uniquement le guillemet double s'il correspondait.
dbn
44

Pour supprimer le premier et le dernier caractère, et dans chaque cas, effectuez la suppression uniquement si le caractère en question est un guillemet double:

import re

s = re.sub(r'^"|"$', '', s)

Notez que le modèle RE est différent de celui que vous aviez donné, et que l'opération est sub("substitute") avec une chaîne de remplacement vide ( stripest une méthode de chaîne mais fait quelque chose d'assez différent de vos besoins, comme d'autres réponses l'ont indiqué).

Alex Martelli
la source
4
L'utilisation d'un RE ici est exagérée à mon humble avis. Je préfère la solution avec startsWith.
pihentagy
19
Beaucoup de pythonistes ont des réactions similaires aux ER, qui sont vraiment injustifiées - les RE sont assez rapides. De plus, la solution que vous "préférez", telle que publiée, fait quelque chose de complètement différent (supprime le premier et le dernier caractère uniquement si les deux sont des guillemets doubles - ce qui semble différent des spécifications de l'OP) - si les guillemets de début et de fin (si présents) doivent être supprimées indépendamment, cette solution devient un bloc à 4 déclarations et 2 conditions - maintenant c'est exagéré par rapport à une seule expression plus rapide pour le même travail! -)
Alex Martelli
44

IMPORTANT: J'étends la question / réponse pour supprimer les guillemets simples ou doubles. Et j'interprète la question comme signifiant que LES DEUX citations doivent être présentes et concordantes pour effectuer la bande. Sinon, la chaîne est renvoyée inchangée.

Pour "déquoter" une représentation sous forme de chaîne, qui peut être entourée de guillemets simples ou doubles (c'est une extension de la réponse de @ tgray):

def dequote(s):
    """
    If a string has single or double quotes around it, remove them.
    Make sure the pair of quotes match.
    If a matching pair of quotes is not found, return the string unchanged.
    """
    if (s[0] == s[-1]) and s.startswith(("'", '"')):
        return s[1:-1]
    return s

Explication:

startswithpeut prendre un tuple, pour correspondre à l'une des nombreuses alternatives. La raison pour laquelle les parenthèses DoubleD ((et ))est pour que nous passons un paramètre ("'", '"')à startswith(), pour spécifier les préfixes autorisés, au lieu de deux paramètres "'"et '"'qui serait interprété comme un préfixe et un (invalide) position de départ.

s[-1] est le dernier caractère de la chaîne.

Essai:

print( dequote("\"he\"l'lo\"") )
print( dequote("'he\"l'lo'") )
print( dequote("he\"l'lo") )
print( dequote("'he\"l'lo\"") )

=>

he"l'lo
he"l'lo
he"l'lo
'he"l'lo"

(Pour moi, les expressions regex ne sont pas évidentes à lire, donc je n'ai pas essayé d'étendre la réponse de @ Alex.)

OutilleurSteve
la source
1
Si vous vérifiez d'abord que le premier et le dernier caractère sont identiques, il vous suffit ensuite de vérifier si le premier caractère est un guillemet: def strip_if_quoted (name): if name [0] == name [-1] and name [0 ] in ("'",' "'): return name [1: -1]
TomOnTime
@TomOnTime: Vous avez raison, c'est une bonne optimisation. Je l'ai appliqué.
ToolmakerSteve
4
Je recommanderais de gérer des chaînes de 2 caractères ou moins. À l'heure actuelle, cette fonction peut lever une exception d'index hors limites pour une chaîne de longueur 0. En outre, vous pouvez supprimer un guillemet d'une chaîne de 1 caractère. Vous pouvez ajouter un garde len(s) >= 2, ou quelque chose de similaire.
BrennanR
16

Si la chaîne est toujours comme vous le montrez:

string[1:-1]
Larry
la source
9

Presque fini. Citant de http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

L'argument chars est une chaîne spécifiant le jeu de caractères à supprimer.

[...]

L'argument chars n'est pas un préfixe ou un suffixe; au contraire, toutes les combinaisons de ses valeurs sont supprimées:

L'argument n'est donc pas une expression rationnelle.

>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>> 

Notez que ce n'est pas exactement ce que vous avez demandé, car il mange plusieurs guillemets des deux extrémités de la chaîne!

pihentagy
la source
Sert parfaitement à mon objectif! Merci beaucoup.
Harsh Wardhan
4

Si vous êtes sûr qu'il y a un "au début et à la fin, que vous souhaitez supprimer, faites simplement:

string = string[1:len(string)-1]

ou

string = string[1:-1]
TooAngel
la source
2

Supprime une chaîne déterminée du début et de la fin d'une chaîne.

s = '""Hello World""'
s.strip('""')

> 'Hello World'
nsantana
la source
1

J'ai du code qui doit supprimer les guillemets simples ou doubles, et je ne peux pas simplement ast.literal_eval.

if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
    arg = arg[1:-1]

Ceci est similaire à la réponse de ToolmakerSteve, mais cela autorise des chaînes de longueur 0 et ne transforme pas le caractère unique "en une chaîne vide.

dbn
la source
0

dans votre exemple, vous pouvez utiliser une bande mais vous devez fournir l'espace

string = '"" " " ""\\1" " "" ""'
string.strip('" ')  # output '\\1'

notez que le \ 'dans la sortie est les guillemets python standard pour la sortie de chaîne

la valeur de votre variable est '\\ 1'

RomainL.
la source
0

La fonction ci-dessous supprimera les spces vides et renverra les chaînes sans guillemets. S'il n'y a pas de guillemets, il retournera la même chaîne (supprimée)

def removeQuote(str):
str = str.strip()
if re.search("^[\'\"].*[\'\"]$",str):
    str = str[1:-1]
    print("Removed Quotes",str)
else:
    print("Same String",str)
return str
Sumer
la source
0

À partir de Python 3.9, vous pouvez utiliser removeprefixet removesuffix:

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
Xavier Guihot
la source
-1

trouver la position du premier et du dernier "dans votre chaîne

>>> s = '"" " " ""\\1" " "" ""'
>>> l = s.find('"')
>>> r = s.rfind('"')

>>> s[l+1:r]
'" " " ""\\1" " "" "'
remosu
la source