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:
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.
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).
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).
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.
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('"')
.Respuestas:
Si las citas que desea eliminar siempre van a ser "primeras y últimas" como dijo, entonces simplemente podría usar:
string = string[1:-1]
fuente
Si no puede asumir que todas las cadenas que procesa tienen comillas dobles, puede usar algo como esto:
Editar:
Estoy seguro de que acaba de usar
string
como 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 nombradostring
en las bibliotecas estándar. No se carga automáticamente, pero si alguna vez lo usa,import string
asegúrese de que su variable no la eclipse.fuente
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:
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 (strip
es un método de cadena pero hace algo bastante diferente a sus requisitos, como han indicado otras respuestas).fuente
startsWith
.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):
Explicación:
startswith
puede 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("'", '"')
astartswith()
, 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:
=>
(Para mí, las expresiones regulares no son obvias de leer, así que no intenté extender la respuesta de @ Alex).
fuente
len(s) >= 2
, o algo similar.Si la cadena es siempre como muestra:
fuente
Casi termino. Citando de http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
[...]
Entonces el argumento no es una expresión regular.
Tenga en cuenta que esto no es exactamente lo que solicitó, ¡porque consume múltiples comillas de ambos extremos de la cadena!
fuente
Si está seguro de que hay un "al principio y al final, que desea eliminar, simplemente haga:
o
fuente
Retire una cadena determinada desde el principio y el final de una cadena.
fuente
Tengo un código que debe eliminar las comillas simples o dobles, y no puedo simplemente ast.literal_eval.
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.fuente
en su ejemplo, podría usar una tira pero debe proporcionar el espacio
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'
fuente
La siguiente función eliminará las áreas vacías y devolverá las cadenas sin comillas. Si no hay comillas, devolverá la misma cadena (despojada)
fuente
Comenzando
Python 3.9
, puede usarremoveprefix
yremovesuffix
:fuente
encuentra la posición del primero y el último "en tu cadena
fuente