2013-08-14 9 views
7

से घिरा हुआ स्ट्रिंग में कॉमा निकालें, मुझे स्टैक ओवरफ्लो पर कुछ समान थीम मिली हैं, लेकिन मैं पाइथन और रेग एक्सप्स के लिए नौसिखिया हूं।एक कॉमा और डबल कोट्स/पायथन

मैं एक स्ट्रिंग है

, "पूरी तरह से 2009 में पुनर्निर्मित, 2-तारा सुपीरियर होटल आइबिस बर्लिन मेसी, अपने 168 वातानुकूलित कमरों के साथ, सही बर्लिन के आईसीसी और प्रदर्शनी के बगल में है सभी कमरों में वाई-फाई है, और आप लॉबी में दो आईपॉइंट-पीसी पर इंटरनेट सर्फ कर सकते हैं। हम 24 घंटे की बार, स्नैक्स और रिसेप्शन सेवा प्रदान करते हैं। हमारे नाश्ता बुफे को 4 बजे से आनंद लें 8 वीं मंजिल पर 12 बजे, जहां आपके पास बर्लिन में शानदार दृश्य है। आपको मुफ्त कार पार्किंग सीधेमिल जाएगीहोटल के बगल में। ",

एक पैटर्न इस तरह होना चाहिए: comma, double quote|any text with commas |double quote, comma। मुझे दोहरे उद्धरणों में अल्पविरामों को प्रतिस्थापित करने की आवश्यकता है, उदाहरण के लिए @ वर्ण के साथ। मुझे किस रेग एक्सप पैटर्न का उपयोग करना चाहिए?

r',"([.*]*,[.*]*)*",' 
विभिन्न रूपों के साथ

, लेकिन यह काम नहीं करता है:

मैं इस कोशिश की।

उत्तर के लिए धन्यवाद, समस्या हल हो गई थी।

उत्तर

2

यदि आपको केवल कैमरे के साथ कॉमा को प्रतिस्थापित करने की आवश्यकता है, तो आपको regex के बजाय str_replace करने में देखना चाहिए।

str_a = "Completely renovated in 2009, the 2-star Superior Hotel Ibis Berlin Messe, with its 168 air-conditioned rooms, is located right next to Berlin's ICC and exhibition center. All rooms have Wi-Fi, and you can surf the Internet free of charge at two iPoint-PCs in the lobby. We provide a 24-hour bar, snacks and reception service. Enjoy our breakfast buffet from 4am to 12pm on the 8th floor, where you have a fantastic view across Berlin. You will find free car parking directly next to the hotel." 

str_a = str_a.replace('","', '@') #commas inside double quotes 
str_a = str_a.replace(',', '@') #replace just commas 

print str_a 

संपादित करें: वैकल्पिक रूप से आप क्या आप की जगह है, तो यह माध्यम से लूप और प्रतिस्थापन करना चाहते की एक सूची बना सकते हैं। उदाहरण के लिए:

to_replace = ['""', ',', '"'] 

str_a = "Completely renovated in 2009, the 2-star Superior Hotel Ibis Berlin Messe, with its 168 air-conditioned rooms, is located right next to Berlin's ICC and exhibition center. All rooms have Wi-Fi, and you can surf the Internet free of charge at two iPoint-PCs in the lobby. We provide a 24-hour bar, snacks and reception service. Enjoy our breakfast buffet from 4am to 12pm on the 8th floor, where you have a fantastic view across Berlin. You will find free car parking directly next to the hotel." 

for a in to_replace: 
    str_a = str_a.replace(a, '@') 

print str_a 
+0

यह डबल कोट्स के भीतर कई स्ट्रिंग्स संलग्न होने पर काम नहीं करेगा। –

+0

जब आप 'to_replace' के माध्यम से लूप करते हैं तो एक उप लूप बनाते हैं जो आपके सभी तारों के माध्यम से लूप करता है। –

+0

@ रोहितजैन या क्या आप @ प्रतीक के साथ पाठ के पूरे सेट (केवल उद्धरण नहीं) को प्रतिस्थापित करना चाहते हैं? –

2

हम्म, अपने रेगुलर एक्सप्रेशन से संदिग्ध है।

,"([.*]*,[.*]*)*", 

[.*] या तो एक शाब्दिक डॉट या तारांकित (. और * चरित्र कक्षाओं में शाब्दिक हो जाते हैं) से मेल खाएगी।

इसके अतिरिक्त, यदि यह वास्तव में स्ट्रिंग में कुछ मिलान कर सकता है, तो आप केवल एक कॉमा को प्रतिस्थापित कर पाएंगे, क्योंकि शेष स्ट्रिंग (कॉमा शामिल) को रेगेक्स द्वारा उपभोग किया जाएगा और एक बार उपभोग किया जाएगा, प्रतिस्थापित नहीं किया जा सकता दोबारा, जब तक कि आप एक लूप चलाते हैं जब तक कि प्रतिस्थापित करने के लिए कोई और कॉमा न हो।

re.sub के साथ आप क्या कर सकते हैं और उन अल्पविरामों को प्रतिस्थापित करने के लिए है (आप इसे Google कर सकते हैं, उनके बारे में पर्याप्त दस्तावेज है)। आप दोहरे उद्धरण चिह्नों का केवल एक जोड़ी है, तो आप यह सुनिश्चित करें कि केवल अल्पविराम के एक दोहरे उद्धरण के बाद बदल दिया जाता है बना सकते हैं:

,(?=[^"]*"[^"]*$) 

[^"] एक चरित्र है जो एक दोहरे उद्धरण नहीं है का मतलब है। [^"]* का अर्थ है कि यह 0 या अधिक बार दोहराएगा।

$ लाइन के अंत का मतलब है।

अब, लुकहेड (?= ...) यह सुनिश्चित करता है कि कॉमा के सामने क्या है।

here से मेल खाने वाले कॉमा देखें।

उसके बाद, आप आसानी से कॉमा को अपनी इच्छित कीमत से प्रतिस्थापित कर सकते हैं।

str = re.sub(r',(?=[^"]*"[^"]*$)', '@', str) 

यदि कई डबल कोट्स हैं, तो आपको यह सुनिश्चित करना चाहिए कि आगे डबल कोट्स की एक विषम संख्या हो। इस regex का उपयोग करके किया जा सकता है:

,(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$) 

(?: ...) माध्यम से एक गैर पर कब्जा समूह है।

2

आप इसे आजमा सकते हैं (काफी घातक हालांकि)। चाल यहाँ, कि, दोहरे उद्धरण चिह्नों की एक जोड़ी के अंदर किसी भी चरित्र, डबल कोट की विषम संख्या के बाद आता है, निश्चित रूप से यह सोचते है अपने दोहरे उद्धरण चिह्नों संतुलित कर रहे हैं:

s = 'some comma , outside "Some comma , inside" , "Completely , renovated in 2009",' 

import re 
s = re.sub(r',(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)', "@", s) 
print s 

आउटपुट:

some comma , outside "Some comma @ inside" , "Completely @ renovated in 2009", 
2

पैटर्न हमेशा के रूप में वर्णित है, तो निम्न कोड का टुकड़ा तुम क्या चाहते हो जाएगा:

text = ',' + text[1:-2].replace(',', '@') + ',' 

चर्चा

  • text[1:-2] आप मूल स्ट्रिंग, शून्य से पहली और आखिरी पात्रों (अल्पविराम)
  • हम तो संकेत पर करने के लिए सभी के लिए अल्पविराम चालू करने के लिए
  • अंत में .replace() फोन दे देंगे, हम वापस रख परिणामस्वरूप स्ट्रिंग बनाने के लिए पहले और अंतिम कॉमा
+0

+1 अच्छा विकल्प ^^ – Jerry

संबंधित मुद्दे