¿Cómo puedo quitar las primeras y últimas comillas dobles?

102

Quiero quitar las comillas dobles de:

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

para obtener:

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

Traté de usar rstrip, lstripy strip('[^\"]|[\"$]')pero no funcionó.

¿Cómo puedo hacer esto?

Walapa
fuente
5
Las respuestas correctas se dan a continuación. En cuanto a su enfoque strip, tenga en cuenta que a) este método no toma una expresión regular como argumento, b) la expresión regular que proporcionó no habría funcionado de todos modos yc) este método elimina todos los caracteres adyacentes, no solo uno, por lo que habría perdido dos comillas dobles con .strip('"').
Tim Pietzcker

Respuestas:

188

Si las citas que desea eliminar siempre van a ser "primeras y últimas" como dijo, entonces simplemente podría usar:

string = string[1:-1]

houbysoft
fuente
¡El de abajo es más seguro!
R Claven
93

Si no puede asumir que todas las cadenas que procesa tienen comillas dobles, puede usar algo como esto:

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

Editar:

Estoy seguro de que acaba de usar stringcomo nombre de variable para ejemplificación aquí y en su código real tiene un nombre útil, pero me siento obligado a advertirle que hay un módulo nombrado stringen las bibliotecas estándar. No se carga automáticamente, pero si alguna vez lo usa, import stringasegúrese de que su variable no la eclipse.

tgray
fuente
1
Si la cadena es '"' (solo una comilla doble), esto eliminará el carácter único. Creo que esto probablemente no sea lo que se desea, probablemente Walapa solo quería eliminar las comillas dobles si coincidían.
dbn
44

Para eliminar el primer y último carácter, y en cada caso hacer la eliminación solo si el carácter en cuestión es una comilla doble:

import re

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

Tenga en cuenta que el patrón RE es diferente al que había proporcionado, y la operación es sub("sustituto") con una cadena de reemplazo vacía ( stripes un método de cadena pero hace algo bastante diferente a sus requisitos, como han indicado otras respuestas).

Alex Martelli
fuente
4
Usar un RE aquí es una exageración en mi humilde opinión. Prefiero la solución con startsWith.
pihentagy
19
Muchos Pythonistas tienen reacciones similares a los RE, que son realmente injustificados: los RE son bastante rápidos. Además, la solución que "prefiere", tal como se publicó, hace algo completamente diferente (elimina el primer y último carácter solo si ambos son comillas dobles, lo que parece diferente de las especificaciones del OP), si las comillas iniciales y finales (cuando están presentes) debe eliminarse de forma independiente, esa solución se convierte en un bloque de 4 declaraciones y 2 condicionales; ¡ eso es excesivo en comparación con una expresión única y más rápida para el mismo trabajo! -)
Alex Martelli
44

IMPORTANTE: Estoy ampliando la pregunta / respuesta para eliminar las comillas simples o dobles. E interpreto que la pregunta significa que AMBAS citas deben estar presentes y coincidir para realizar la tira. De lo contrario, la cadena se devuelve sin cambios.

Para "quitar de comillas" una representación de cadena, que puede tener comillas simples o dobles alrededor (esta es una extensión de la respuesta 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

Explicación:

startswithpuede tomar una tupla para que coincida con cualquiera de las varias alternativas. El motivo del paréntesis DOBLADO ((y ))es para que pasamos UN parámetro ("'", '"')a startswith(), para especificar los prefijos permitidos, en lugar de DOS parámetros "'"y '"', que se interpretaría como un prefijo y una posición de inicio (no válida).

s[-1] es el último carácter de la cadena.

Pruebas:

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"

(Para mí, las expresiones regulares no son obvias de leer, así que no intenté extender la respuesta de @ Alex).

ToolmakerSteve
fuente
1
Si primero comprueba que el primer carácter y el último son iguales, solo debe comprobar si el primer carácter es una cita: def strip_if_quoted (name): if name [0] == name [-1] y name [0 ] en ("'",' "'): nombre de retorno [1: -1]
TomOnTime
@TomOnTime: Tienes razón, esa es una buena optimización. Lo he aplicado.
ToolmakerSteve
4
Recomendaría manejar cadenas de 2 caracteres o menos. En este momento, esta función puede lanzar una excepción de índice fuera de límites para una cadena de longitud 0. Además, puede quitar una cita de una cadena de 1 carácter de longitud. Podría agregar un guardia len(s) >= 2, o algo similar.
BrennanR
15

Si la cadena es siempre como muestra:

string[1:-1]
Larry
fuente
9

Casi termino. Citando de http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

El argumento chars es una cadena que especifica el conjunto de caracteres que se eliminarán.

[...]

El argumento chars no es un prefijo o sufijo; más bien, todas las combinaciones de sus valores se eliminan:

Entonces el argumento no es una expresión regular.

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

Tenga en cuenta que esto no es exactamente lo que solicitó, ¡porque consume múltiples comillas de ambos extremos de la cadena!

pihentagy
fuente
¡Sirve perfectamente a mi propósito! Muchas gracias.
Harsh Wardhan
4

Si está seguro de que hay un "al principio y al final, que desea eliminar, simplemente haga:

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

o

string = string[1:-1]
TooAngel
fuente
2

Retire una cadena determinada desde el principio y el final de una cadena.

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

> 'Hello World'
nsantana
fuente
1

Tengo un código que debe eliminar las comillas simples o dobles, y no puedo simplemente ast.literal_eval.

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

Esto es similar a la respuesta de ToolmakerSteve, pero permite cadenas de longitud 0 y no convierte el carácter único "en una cadena vacía.

dbn
fuente
0

en su ejemplo, podría usar una tira pero debe proporcionar el espacio

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

tenga en cuenta que el \ 'en la salida son las comillas estándar de Python para la salida de cadena

el valor de su variable es '\\ 1'

RomainL.
fuente
0

La siguiente función eliminará las áreas vacías y devolverá las cadenas sin comillas. Si no hay comillas, devolverá la misma cadena (despojada)

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
fuente
0

Comenzando Python 3.9, puede usar removeprefixy removesuffix:

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

encuentra la posición del primero y el último "en tu cadena

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

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