मैं पहले और अंतिम दोहरे उद्धरणों को कैसे पट्टी कर सकता हूं?


102

मैं दोहरे उद्धरण चिह्नों से लेना चाहता हूं:

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

प्राप्त करना:

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

मैं का उपयोग करने की कोशिश की rstrip, lstripऔर strip('[^\"]|[\"$]')लेकिन यह काम नहीं किया।

मैं यह कैसे कर सकता हूँ?


5
सही उत्तर नीचे दिए गए हैं। के साथ अपने दृष्टिकोण के लिए strip, कृपया ध्यान दें कि a) यह विधि अपने तर्क के रूप में एक regex नहीं लेती है, b) आपके द्वारा आपूर्ति की गई regex ने वैसे भी काम नहीं किया होगा और c) यह विधि सभी आसन्न वर्णों को स्ट्रिप्स करती है, केवल एक नहीं, इसलिए आपने दो दोहरे उद्धरण खो दिए होंगे .strip('"')
टिम पीटरज़

जवाबों:


188

यदि आप जिन उद्धरणों को पट्टी करना चाहते हैं, वे हमेशा "पहले और अंतिम" होने जा रहे हैं, जैसा कि आपने कहा, तो आप बस उपयोग कर सकते हैं:

string = string[1:-1]


नीचे एक सुरक्षित है!
आर क्लावेन

93

यदि आप यह नहीं मान सकते हैं कि आपके द्वारा संसाधित की जाने वाली सभी स्ट्रिंग्स में दोहरे उद्धरण चिह्नों का उपयोग किया जा सकता है:

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

संपादित करें:

मुझे यकीन है कि आपने यहां केवल stringउदाहरण के लिए चर नाम का उपयोग किया है और आपके वास्तविक कोड में इसका एक उपयोगी नाम है, लेकिन मुझे आपको यह चेतावनी देने के लिए बाध्य है कि stringमानक पुस्तकालयों में एक मॉड्यूल नाम है। यह स्वचालित रूप से लोड नहीं है, लेकिन यदि आप कभी भी उपयोग करते हैं import stringतो सुनिश्चित करें कि आपका चर इसे ग्रहण नहीं करता है।


1
यदि स्ट्रिंग '' '' (सिर्फ एक डबल उद्धरण) है, तो यह एकल वर्ण को हटा देगा। मुझे लगता है कि यह शायद वह नहीं है जो वांछित है, शायद वालापा मेल होने पर ही दोहरे उद्धरण को हटाना चाहता था।
dbn

44

पहले और अंतिम वर्णों को हटाने के लिए, और प्रत्येक मामले में निष्कासन केवल तभी होता है जब प्रश्न में वर्ण दोहरा उद्धरण हो:

import re

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

ध्यान दें कि आरई पैटर्न आपके द्वारा दिए गए से अलग है, और ऑपरेशन subएक खाली प्रतिस्थापन स्ट्रिंग के साथ ("विकल्प") है ( stripएक स्ट्रिंग विधि है लेकिन आपकी आवश्यकताओं से बहुत अलग है, जैसा कि अन्य उत्तरों ने संकेत दिया है)।


4
यहाँ RE का उपयोग करना IMHO ओवरकिल है। मैं के साथ समाधान पसंद करते हैं startsWith
पाइयेंटैगी

19
Pythonistas के बहुत सारे REs के समान प्रतिक्रियाएं हैं, जो वास्तव में अनुचित हैं - REs काफी तेज़ हैं। साथ ही, जो समाधान आप "पसंद" करते हैं, पोस्ट किया गया है, कुछ पूरी तरह से अलग करता है (केवल पहले और अंतिम चार को हटाता है अगर दोनों दोहरे उद्धरण हैं - जो ओपी के चश्मे से अलग लगता है) - यदि अग्रणी और अनुगामी उद्धरण (वर्तमान में) स्वतंत्र रूप से हटाए जाने की जरूरत है, यह समाधान 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कई विकल्पों में से किसी से मेल खाने के लिए, एक टपल ले सकते हैं। DOUBLED कोष्ठकों का कारण ((और ))ऐसा है कि हम दो मापदंडों के बजाय अनुमत उपसर्गों को निर्दिष्ट करने के ("'", '"')लिए एक पैरामीटर पास 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"

(मेरे लिए, रेगेक्स एक्सप्रेशन पढ़ने में स्पष्ट नहीं हैं, इसलिए मैंने @ एलेक्स के उत्तर का विस्तार करने की कोशिश नहीं की।)


1
यदि आप पहली बार जांचते हैं कि पहला और आखिरी चार्ट समान है, तो आपको केवल यह जांचने की आवश्यकता है कि पहला चार्ट एक उद्धरण है: def strip_if_quoted (नाम): यदि नाम [0] == नाम [-1] और नाम [0] ] ("" "," ""): वापसी नाम [1: -1]
टॉमऑनटाइम

@TomOnTime: आप सही हैं, यह एक अच्छा अनुकूलन है। मैंने इसे लागू किया है।
टूलमेकरस्टेव

4
मैं ऐसे स्ट्रिंग्स को संभालने की सलाह दूंगा जो 2 वर्ण या उससे कम के हों। अभी यह फ़ंक्शन 0. की लंबाई के स्ट्रिंग के लिए सीमा अपवाद से बाहर एक इंडेक्स फेंक सकता है। इसके अलावा, आप एक स्ट्रिंग से एक उद्धरण खींच सकते हैं जो 1 वर्ण लंबा है। आप एक गार्ड len(s) >= 2, या कुछ समान जोड़ सकते हैं ।
BrennanR

16

यदि स्ट्रिंग हमेशा वैसा ही हो जैसा कि आप दिखाते हैं:

string[1:-1]

9

लगभग हो गया। Http://docs.python.org/library/stdtypes.html?highlight=strip#t.rip से उद्धरण

वर्ण तर्क एक स्ट्रिंग है जो वर्णों के सेट को हटाने के लिए निर्दिष्ट करता है।

[...]

वर्ण तर्क कोई उपसर्ग या प्रत्यय नहीं है; बल्कि, इसके मूल्यों के सभी संयोजन छीन लिए गए हैं:

तो तर्क एक रेगेक्स नहीं है।

>>> 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]

यह टूलमेकरसैटव के उत्तर के समान है, लेकिन यह 0 लंबाई के तार की अनुमति देता है, और एकल वर्ण "को खाली स्ट्रिंग में नहीं बदलता है।


0

आपके उदाहरण में आप पट्टी का उपयोग कर सकते हैं लेकिन आपको स्थान प्रदान करना होगा

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

ध्यान दें कि आउटपुट में \ n स्ट्रिंग आउटपुट के लिए मानक पायथन उद्धरण है

आपके चर का मान '\\ 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.