Як я можу зняти першу та останню подвійні лапки?


102

Я хочу зняти подвійні цитати з:

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

щоб отримати:

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

Я намагався використовувати rstrip, lstripі , strip('[^\"]|[\"$]')але це не робота.

Як я можу це зробити?


5
Правильні відповіді наведені нижче. Що стосується вашого підходу strip, зауважте, що: a) цей метод не приймає регулярний вираз як його аргумент; ви втратили б дві подвійні лапки .strip('"').
Тім Піцкер

Відповіді:


188

Якщо цитати, які ви хочете зняти, завжди будуть "першими і останніми", як ви вже говорили, тоді ви можете просто використовувати:

string = string[1:-1]


Той, що нижче, безпечніший!
R Клавен

93

Якщо ви не можете припустити, що всі оброблювані рядки мають подвійні лапки, ви можете використовувати щось подібне:

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

Редагувати:

Я впевнений, що ви просто використовували stringтут назву змінної для прикладу, і у вашому реальному коді вона є корисною назвою, але я відчуваю обов'язок попередити вас, що stringв стандартних бібліотеках є модуль, названий . Він не завантажується автоматично, але якщо ви коли-небудь використовувати, import stringпереконайтеся, що ваша змінна не затьмарить її.


1
Якщо рядок "" "(лише одна подвійна цитата), це видалить єдиний символ. Я думаю, що це, мабуть, не те, що бажано, ймовірно, Валапа хотів видалити подвійну
лапочку,

44

Щоб видалити перший і останній символи, і в кожному випадку виконайте видалення, лише якщо відповідний символ є подвійною цитатою:

import re

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

Зауважте, що шаблон RE відрізняється від того, який ви задали, і операція sub("заміна") порожнім рядком заміни ( stripє рядковим методом, але робить щось зовсім інше, ніж ваші вимоги, як показали інші відповіді).


4
Використання RE тут є надмірним IMHO. Я вважаю за краще рішення з startsWith.
pihentagy

19
Багато піфоністів мають подібні реакції на РЕ, які справді невиправдані - РЕ досить швидкі. Крім того, рішення, яке ви віддаєте перевагу, як розміщене, робить щось зовсім інше (видаляє першу та останню таблицю лише у тому випадку, якщо обидві є подвійними котируваннями - що здається відмінним від специфікацій ОП) - якщо провідні та кінцеві цитати (за наявності) потрібно видалити самостійно, це рішення стає блоком 4-висловлювань, 2-умовними умовами - тепер це надмірність в порівнянні з одним, швидшим виразом для тієї ж роботи! -)
Alex Martelli

44

ВАЖЛИВО: Я розширюю питання / відповідь, щоб викреслити окремі або подвійні лапки. І я інтерпретую питання, що означає, що цитати BOTH повинні бути присутніми, а також відповідати виконувати смужку. В іншому випадку рядок повертається незмінним.

Щоб "декітувати" рядкове представлення, яке може мати одиничні або подвійні лапки (це розширення відповіді @ 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 (ім'я): якщо ім'я [0] == ім’я [-1] та ім’я [0 ] in ("'",' "'): ім'я повернення [1: -1]
TomOnTime

@TomOnTime: Ви праві, це хороша оптимізація. Я застосував це.
ToolmakerSteve

4
Я рекомендую обробляти рядки, що містять 2 символи або менше. Зараз ця функція може викидати індекс за межі виключення для рядка довжиною 0. Крім того, ви можете зняти цитату з рядка довжиною 1 символ. Ви можете додати охорону len(s) >= 2чи щось подібне.
BrennanR


9

Майже зроблено. Цитування з http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

Аргумент символів - це рядок із зазначенням набору символів, який потрібно видалити.

[...]

Аргумент chars не є префіксом або суфіксом; швидше, всі комбінації його значень позбавлені:

Отже, аргумент - це не зворотний перелік.

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

Зауважте, що це не саме те, що ви просили, оскільки воно їсть кілька лапок з обох кінців рядка!


Прекрасно служить моєму призначенню! Дуже дякую.
Суворий Вардан

4

Якщо ви впевнені, що "на початку та в кінці є", яке потрібно видалити, просто зробіть:

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

або

string = string[1:-1]

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 рядків довжини і не перетворює один символ "у порожній рядок.


0

у вашому прикладі ви можете використовувати смужку, але вам потрібно забезпечити простір

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

Зверніть увагу, що \ "у висновку - це стандартні лапки python для виведення рядка

значення змінної - "\\ 1"


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


-1

знайдіть позицію першого і останнього "у вашому рядку

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.