2010-09-07 17 views
34

के अंत में केवल सबस्ट्रिंग को दूर मैं तारअजगर: स्ट्रिंग

का एक समूह है, उनमें से कुछ ' rec'

है मैं दूर करने के लिए है कि केवल अगर उन पिछले 4 अक्षर

इसलिए कर रहे हैं चाहते हैं दूसरे शब्दों

somestring='this is some string rec' 

मैं इसे होना चाहते हैं:

somestring='this is some string' 

इस तक पहुंचने के लिए पाइथन तरीका क्या है?

+0

संभव डुप्लिकेट [अजगर एक स्ट्रिंग के अंतिम 3 अक्षरों निकालें] (http://stackoverflow.com/questions/1798465/python-remove-last-3-characters-of- एक-स्ट्रिंग) की – outis

+0

संभव डुप्लिकेट [मैं कैसे पायथन में एक स्ट्रिंग के अंत से सबस्ट्रिंग निकालूँ?] (http://stackoverflow.com/questions/1038824/how-do-i-remove-a-substring- ऑफ-द-एंड-ए-स्ट्रिंग-इन-पायथन) –

उत्तर

48
def rchop(thestring, ending): 
    if thestring.endswith(ending): 
    return thestring[:-len(ending)] 
    return thestring 

somestring = rchop(somestring, ' rec') 
+3

अच्छी चीजें; अंतर्निहित 'str' – bernie

+0

को छायांकित करने और संपादित करने के लिए बस देखें। धन्यवाद। ! बल्कि,) मैं तुम्हें रोजगार पहचानकर्ता के लिए इस्तेमाल किया जा रहा है की कोशिश की सलाह देते हैं - –

+4

@Jack, 'स्ट्रिंग' एक मानक पुस्तकालय मॉड्यूल का नाम है, कि एक बुरा विचार, के साथ कोई अंतर्निहित से कम nameclash को _also_ सकता है ... है जैसे 'थस्ट्रिंग', 'एस्ट्रिंग', और जैसे, इसके बजाए! -)। –

4

साथ ही आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

from re import sub 

str = r"this is some string rec" 
regex = r"(.*)\srec$" 
print sub(regex, r"\1", str) 
+8

कैप्चरिंग समूह यहां अधिक हो गए हैं। 'सब ('रिक $', '', str) 'काम करता है। –

19

के बाद से तुम वैसे भी len(trailing) प्राप्त करने के लिए (जहां trailing स्ट्रिंग आप अगर यह अनुगामी है निकालना चाहते है), मैं परहेज की सलाह देते हैं इस मामले में .endswith काम का मामूली दोहराव होगा। बेशक, कोड का सबूत समय में है, इसलिए, चलो कुछ माप (कार्यों के बाद उत्तरदाताओं उन्हें प्रस्ताव नामकरण) करते हैं:

import re 

astring = 'this is some string rec' 
trailing = ' rec' 

def andrew(astring=astring, trailing=trailing): 
    regex = r'(.*)%s$' % re.escape(trailing) 
    return re.sub(regex, r'\1', astring) 

def jack0(astring=astring, trailing=trailing): 
    if astring.endswith(trailing): 
     return astring[:-len(trailing)] 
    return astring 

def jack1(astring=astring, trailing=trailing): 
    regex = r'%s$' % re.escape(trailing) 
    return re.sub(regex, '', astring) 

def alex(astring=astring, trailing=trailing): 
    thelen = len(trailing) 
    if astring[-thelen:] == trailing: 
     return astring[:-thelen] 
    return astring 

हम इस अजगर फ़ाइल a.py नाम दिया है कहो और क्या है वर्तमान निर्देशिका; अब, ...:

$ python2.6 -mtimeit -s'import a' 'a.andrew()' 
100000 loops, best of 3: 19 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.jack0()' 
1000000 loops, best of 3: 0.564 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.jack1()' 
100000 loops, best of 3: 9.83 usec per loop 
$ python2.6 -mtimeit -s'import a' 'a.alex()' 
1000000 loops, best of 3: 0.479 usec per loop 

जैसा कि आप देख, आरई आधारित समाधान "बुरी से हराया" कर रहे हैं (जैसा कि अक्सर होता है जब एक "Overkills" एक समस्या - संभवतः कारणों आर ई में से एक है इस तरह के एक बुरा पाइथन समुदाय में प्रतिनिधि! -), हालांकि @ जैक की टिप्पणी में सुझाव @ एंड्रयू के मूल से बेहतर तरीका है। स्ट्रिंग-आधारित समाधान, जैसा कि अपेक्षित, शिंग, मेरे endswith के साथ-साथ @ जैक के ऊपर एक छोटा सा लाभ होने पर (केवल 15% तेज होने के कारण)। तो, शुद्ध-स्ट्रिंग दोनों विचार अच्छे हैं (साथ ही दोनों संक्षेप में और स्पष्ट हैं) - मैं अपने संस्करण को थोड़ा सा पसंद करता हूं क्योंकि मैं चरित्र द्वारा, एक मितव्ययी हूं (कुछ कह सकता है, कट्टर ;-) व्यक्ति .. । "नहीं बर्बाद, नहीं चाहता" -)

+0

आपके पास एक 'a.xxx आयात' में एक स्थान है? – Blankman

+0

@Blankman, यह एक बैश अजगर चल आदेश दिया गया है: सेटअप ('-s') एक तर्क, कोड अन्य समय समाप्त हो जा रहा है। प्रत्येक को उद्धृत किया गया है इसलिए मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है जिसमें रिक्त स्थान और/या विशेष चरित्र, ओएस पाठ्यक्रम शामिल हैं। आप हमेशा बाश में रिक्त स्थान के साथ तर्क अलग करते हैं (और विंडोज़ के स्वयं के cmd.exe सहित अधिकांश अन्य गोले, इसलिए मैं आपके प्रश्न पर बहुत हैरान हूं!), और प्रत्येक तर्क के भीतर रिक्त स्थान और विशेष वर्णों को संरक्षित करने के लिए शेल कमांड पर तर्क उद्धृत करना ! भी निश्चित रूप से क्या मैं किसी भी खोल ... की, अजीब दुर्लभ, या उन्नत उपयोग कहेंगे नहीं है -) –

+0

ओह मैं देख रहा हूँ तुम 'नजरअंदाज कर दिया है endswith' के रूप में मैं जैक के जवाब में बताया गया। लेन को पकड़ने से पाइथन (और सी!) भयानक कॉल ओवरहेड से बचा जाता है। –

1

एक लाइनर जनरेटर की तरह शामिल हो गए के रूप में:,

import re 

somestring='this is some string rec' 

somestring = re.sub(' rec$', '', somestring) 
8

गति महत्वपूर्ण नहीं है, तो regex का उपयोग rstrip स्ट्रिंग जो एक अनुमानित पास कर सकते हैं।

स्थापना

> pip install more_itertools 

कोड

import more_itertools as mit 


iterable = "this is some string rec".split() 
" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "})) 
# 'this is some string' 

" ".join(mit.rstrip(iterable, pred=lambda x: x in {"rec", " "})) 
# 'this is some string' 

यहाँ हम सब अनुगामी आइटम हम अंत से पट्टी करना चाहते हैं गुजरती हैं।

विवरण के लिए more_itertools docs भी देखें।

0

more_itertools इस्तेमाल करते हुए हम:

test = """somestring='this is some string rec' 
this is some string in the end word rec 
This has not the word.""" 
match = 'rec' 
print('\n'.join((line[:-len(match)] if line.endswith(match) else line) 
     for line in test.splitlines())) 
""" Output: 
somestring='this is some string rec' 
this is some string in the end word 
This has not the word. 
""" 
संबंधित मुद्दे