Как убрать первые и последние двойные кавычки?

102

Я хочу удалить двойные кавычки из:

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

чтобы получить:

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

Я пытался использовать rstrip, lstripи , strip('[^\"]|[\"$]')но это не работа.

Как я могу это сделать?

Валапа
источник
6
Правильные ответы даны ниже. Что касается вашего подхода strip, обратите внимание, что а) этот метод не принимает регулярное выражение в качестве аргумента, б) предоставленное вами регулярное выражение все равно не сработало бы и в) этот метод удаляет все соседние символы, а не только один, поэтому вы бы потеряли две двойные кавычки с .strip('"').
Тим Пицкер

Ответы:

189

Если цитаты, которые вы хотите удалить, всегда будут «первыми и последними», как вы сказали, то вы можете просто использовать:

string = string[1:-1]

Houbysoft
источник
Тот, что ниже, безопаснее!
R Claven
93

Если вы не можете предположить, что все строки, которые вы обрабатываете, имеют двойные кавычки, вы можете использовать что-то вроде этого:

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

Редактировать:

Я уверен, что вы просто использовали stringимя переменной для примера здесь, и в вашем реальном коде у него есть полезное имя, но я чувствую себя обязанным предупредить вас, что stringв стандартных библиотеках есть модуль, названный . Он не загружается автоматически, но если вы когда-нибудь используете его, import stringубедитесь, что ваша переменная не затмевает его.

tgray
источник
1
Если строка равна '"' (только одна двойная кавычка), это удалит одиночный символ. Я думаю, что это, вероятно, не то, что желательно, вероятно, Валапа хотел удалить двойные кавычки, только если они совпали.
dbn
44

Чтобы удалить первый и последний символы и в каждом случае удалять только в том случае, если рассматриваемый символ является двойной кавычкой:

import re

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

Обратите внимание, что шаблон RE отличается от того, который вы указали, и операция sub(«замена») с пустой строкой замены ( stripэто строковый метод, но делает что-то довольно отличное от ваших требований, как указано в других ответах).

Алекс Мартелли
источник
4
ИМХО, использование RE - это излишество. Я предпочитаю решение с startsWith.
pihentagy
19
Многие питонисты имеют похожие реакции на RE, что на самом деле неоправданно - RE довольно быстрые. Кроме того, решение, которое вы "предпочитаете", как было опубликовано, делает что-то совершенно другое (удаляет первый и последний символы, только если оба являются двойными кавычками - что кажется отличным от спецификаций OP) - если ведущие и конечные кавычки (если они есть) необходимо удалить независимо, это решение становится блоком из 4 операторов и 2 условий - теперь это перебор по сравнению с одним, более быстрым выражением для той же работы! -)
Alex Martelli
44

ВАЖНО: я расширяю вопрос / ответ, чтобы убрать одинарные или двойные кавычки. И я интерпретирую этот вопрос как означающий, что для выполнения полосы должны присутствовать ОБЕ цитаты и совпадать. В противном случае строка возвращается без изменений.

Чтобы "отменить кавычки" строковое представление, которое может заключаться в одинарные или двойные кавычки (это расширение ответа @ 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

Пояснение:

startswithможет принимать кортеж, соответствующий любой из нескольких альтернатив. Причина использования ДВОЙНЫХ круглых скобок ((и ))заключается в том, что мы передаем ОДИН параметр ("'", '"')в startswith(), чтобы указать разрешенные префиксы, а не ДВА параметра "'"и '"', что было бы интерпретировано как префикс и (недопустимая) начальная позиция.

s[-1] это последний символ в строке.

Тестирование:

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"

(Для меня выражения регулярных выражений неочевидны для чтения, поэтому я не пытался расширить ответ @Alex.)

ИнструментальщикСтив
источник
1
Если вы сначала убедитесь, что первый и последний символы совпадают, тогда вам нужно будет только проверить, является ли первый символ цитатой: def strip_if_quoted (name): if name [0] == name [-1] и name [0 ] in ("'",' "'): возвращаемое имя [1: -1]
TomOnTime
@TomOnTime: Вы правы, это хорошая оптимизация. Я применил это.
ToolmakerSteve
4
Я бы рекомендовал обрабатывать строки длиной 2 символа или меньше. Прямо сейчас эта функция может генерировать исключение индекса за пределами границ для строки длиной 0. Кроме того, вы можете вырезать цитату из строки длиной 1 символ. Вы можете добавить охранника len(s) >= 2или что-то подобное.
BrennanR
16

Если строка всегда такая, как вы показываете:

string[1:-1]
Ларри
источник
9

Почти сделано. Цитата из http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

Аргумент chars - это строка, определяющая набор символов, которые необходимо удалить.

[...]

Аргумент chars не является префиксом или суффиксом; скорее, все комбинации его значений удаляются:

Таким образом, аргумент не является регулярным выражением.

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

Обратите внимание, что это не совсем то, что вы просили, потому что он использует несколько кавычек с обоих концов строки!

Pihentagy
источник
Идеально служит моей цели! Большое спасибо.
Harsh Wardhan
4

Если вы уверены, что в начале и в конце есть знак ", который вы хотите удалить, просто выполните:

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

или

string = string[1:-1]
TooAngel
источник
2

Удалите определенную строку из начала и из конца строки.

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

> 'Hello World'
нсантана
источник
1

У меня есть код, в котором нужно убрать одинарные или двойные кавычки, и я не могу просто ast.literal_eval.

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

Это похоже на ответ ToolmakerSteve, но он допускает строки 0 длины и не превращает отдельный символ "в пустую строку.

dbn
источник
0

в вашем примере вы можете использовать полосу, но вы должны предоставить пространство

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

обратите внимание, что \ 'в выводе - это стандартные кавычки Python для строкового вывода

значение вашей переменной '\\ 1'

RomainL.
источник
0

Функция ниже удалит пустые символы и вернет строки без кавычек. Если нет кавычек, он вернет ту же строку (разделенную)

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
Шумер
источник
0

Начиная с Python 3.9, вы можете использовать removeprefixи removesuffix:

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
Ксавье Гихот
источник
-1

найти позицию первого и последнего "в вашей строке

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
Ремосу
источник