Правильные ответы даны ниже. Что касается вашего подхода strip, обратите внимание, что а) этот метод не принимает регулярное выражение в качестве аргумента, б) предоставленное вами регулярное выражение все равно не сработало бы и в) этот метод удаляет все соседние символы, а не только один, поэтому вы бы потеряли две двойные кавычки с .strip('"').
Тим Пицкер
Ответы:
189
Если цитаты, которые вы хотите удалить, всегда будут «первыми и последними», как вы сказали, то вы можете просто использовать:
Если вы не можете предположить, что все строки, которые вы обрабатываете, имеют двойные кавычки, вы можете использовать что-то вроде этого:
if string.startswith('"')and string.endswith('"'):
string = string[1:-1]
Редактировать:
Я уверен, что вы просто использовали stringимя переменной для примера здесь, и в вашем реальном коде у него есть полезное имя, но я чувствую себя обязанным предупредить вас, что stringв стандартных библиотеках есть модуль, названный . Он не загружается автоматически, но если вы когда-нибудь используете его, import stringубедитесь, что ваша переменная не затмевает его.
Если строка равна '"' (только одна двойная кавычка), это удалит одиночный символ. Я думаю, что это, вероятно, не то, что желательно, вероятно, Валапа хотел удалить двойные кавычки, только если они совпали.
dbn
44
Чтобы удалить первый и последний символы и в каждом случае удалять только в том случае, если рассматриваемый символ является двойной кавычкой:
import re
s = re.sub(r'^"|"$','', s)
Обратите внимание, что шаблон RE отличается от того, который вы указали, и операция sub(«замена») с пустой строкой замены ( stripэто строковый метод, но делает что-то довольно отличное от ваших требований, как указано в других ответах).
ИМХО, использование 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(), чтобы указать разрешенные префиксы, а не ДВА параметра "'"и '"', что было бы интерпретировано как префикс и (недопустимая) начальная позиция.
Если вы сначала убедитесь, что первый и последний символы совпадают, тогда вам нужно будет только проверить, является ли первый символ цитатой: 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или что-то подобное.
strip
, обратите внимание, что а) этот метод не принимает регулярное выражение в качестве аргумента, б) предоставленное вами регулярное выражение все равно не сработало бы и в) этот метод удаляет все соседние символы, а не только один, поэтому вы бы потеряли две двойные кавычки с.strip('"')
.Ответы:
Если цитаты, которые вы хотите удалить, всегда будут «первыми и последними», как вы сказали, то вы можете просто использовать:
string = string[1:-1]
источник
Если вы не можете предположить, что все строки, которые вы обрабатываете, имеют двойные кавычки, вы можете использовать что-то вроде этого:
Редактировать:
Я уверен, что вы просто использовали
string
имя переменной для примера здесь, и в вашем реальном коде у него есть полезное имя, но я чувствую себя обязанным предупредить вас, чтоstring
в стандартных библиотеках есть модуль, названный . Он не загружается автоматически, но если вы когда-нибудь используете его,import string
убедитесь, что ваша переменная не затмевает его.источник
Чтобы удалить первый и последний символы и в каждом случае удалять только в том случае, если рассматриваемый символ является двойной кавычкой:
Обратите внимание, что шаблон RE отличается от того, который вы указали, и операция
sub
(«замена») с пустой строкой замены (strip
это строковый метод, но делает что-то довольно отличное от ваших требований, как указано в других ответах).источник
startsWith
.ВАЖНО: я расширяю вопрос / ответ, чтобы убрать одинарные или двойные кавычки. И я интерпретирую этот вопрос как означающий, что для выполнения полосы должны присутствовать ОБЕ цитаты и совпадать. В противном случае строка возвращается без изменений.
Чтобы "отменить кавычки" строковое представление, которое может заключаться в одинарные или двойные кавычки (это расширение ответа @ tgray):
Пояснение:
startswith
может принимать кортеж, соответствующий любой из нескольких альтернатив. Причина использования ДВОЙНЫХ круглых скобок((
и))
заключается в том, что мы передаем ОДИН параметр("'", '"')
вstartswith()
, чтобы указать разрешенные префиксы, а не ДВА параметра"'"
и'"'
, что было бы интерпретировано как префикс и (недопустимая) начальная позиция.s[-1]
это последний символ в строке.Тестирование:
=>
(Для меня выражения регулярных выражений неочевидны для чтения, поэтому я не пытался расширить ответ @Alex.)
источник
len(s) >= 2
или что-то подобное.Если строка всегда такая, как вы показываете:
источник
Почти сделано. Цитата из http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
[...]
Таким образом, аргумент не является регулярным выражением.
Обратите внимание, что это не совсем то, что вы просили, потому что он использует несколько кавычек с обоих концов строки!
источник
Если вы уверены, что в начале и в конце есть знак ", который вы хотите удалить, просто выполните:
или
источник
Удалите определенную строку из начала и из конца строки.
источник
У меня есть код, в котором нужно убрать одинарные или двойные кавычки, и я не могу просто ast.literal_eval.
Это похоже на ответ ToolmakerSteve, но он допускает строки 0 длины и не превращает отдельный символ
"
в пустую строку.источник
в вашем примере вы можете использовать полосу, но вы должны предоставить пространство
обратите внимание, что \ 'в выводе - это стандартные кавычки Python для строкового вывода
значение вашей переменной '\\ 1'
источник
Функция ниже удалит пустые символы и вернет строки без кавычек. Если нет кавычек, он вернет ту же строку (разделенную)
источник
Начиная с
Python 3.9
, вы можете использоватьremoveprefix
иremovesuffix
:источник
найти позицию первого и последнего "в вашей строке
источник