最初と最後の二重引用符を削除するにはどうすればよいですか?


102

二重引用符を取り除きたい:

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

取得するには:

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

私が使用しようとしましたrstriplstripそしてstrip('[^\"]|[\"$]')それはうまくいきませんでした。

これどうやってするの?


5
正解は以下のとおりです。を使用したアプローチstripについては、a)このメソッドは引数として正規表現を使用しないこと、b)指定した正規表現が機能しないこと、c)このメソッドは1つだけでなく、隣接するすべての文字を削除することに注意してください。を使用すると、2つの二重引用符が失われます.strip('"')
Tim Pietzcker

回答:


188

削除する引用符が常に「最初と最後」になる場合は、次のように使用できます。

string = string[1:-1]


以下の方が安全です!
Rクラヴェン2016

93

処理するすべての文字列に二重引用符があると想定できない場合は、次のようなものを使用できます。

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

編集:

stringここで例示のための変数名として使用しただけで、実際のコードでは有用な名前が付いていると思いますがstring、標準ライブラリで指定されたモジュールがあることを警告する義務があります。自動的に読み込まれるimport stringわけではありませんが、使用する場合は、変数がそれを妨げないようにしてください。


1
文字列は「"」(ただ一つの二重引用符)である場合、これは単一の文字を削除します私はおそらくWalapaは、それがマッチした場合にのみ、二重引用符を削除したい、これが希望されているものはおそらくないと思います。。
DBN

44

最初と最後の文字を削除するには、それぞれの場合で、問題の文字が二重引用符である場合にのみ削除します。

import re

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

REパターンは指定したパターンとは異なり、操作はsub(「置換」)空の置換文字列(strip文字列メソッドですが、他の回答が示しているように、要件とはかなり異なるものになります)であることに注意してください。


4
ここでREを使用するのはやりすぎです。私はstartsWith
pihentagy 2010年

19
多くのPythonの開発者はREに対して同様の反応を示しますが、これは本当に不当です。REは非常に高速です。さらに、あなたが「推奨する」解決策は、投稿されたとおり、まったく異なる何かを行います(両方が二重引用符である場合に限り、最初と最後の文字を削除します-OPの仕様とは異なるように見えます)-先行および後続の引用符がある場合(存在する場合)独立して削除する必要が、そのソリューションは、4-文、2-条件文のブロックになり-今それの行き過ぎ同じ仕事のための単一の、より高速な発現と比較- !)
アレックスマルテッリ

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] and name [0 ] in( "'"、' "'):return name [1:-1]
TomOnTime

@TomOnTime:あなたは正しい、それは良い最適化です。適用しました。
ToolmakerSteve 2014

4
2文字以下の文字列を扱うことをお勧めします。現在、この関数は、長さが0の文字列に対して範囲外のインデックスをスローできます。さらに、1文字の長さの文字列から引用符を取り除くことができます。ガードなどを追加できlen(s) >= 2ます。
BrennanR、2015


9

ほぼ完了しました。http://docs.python.org/library/stdtypes.html?highlight=strip#str.stripからの引用

chars引数は、削除する文字のセットを指定する文字列です。

[...]

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

以下の関数は空のspcesを取り除き、引用符なしで文字列を返します。引用符がない場合は、同じ文字列を返します(除去されます)

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" " "" "'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.