अजगर में एक विशिष्ट चरित्र के बाद सभी पात्रों को कैसे निकालना है?


148

मेरे पास एक तार है। मैं एक निश्चित चरित्र के बाद सभी पाठ कैसे निकालूं? ( इस मामले में... )
पाठ के बाद ...बदल जाएगा इसलिए मैं एक निश्चित एक के बाद सभी पात्रों को निकालना चाहता हूं।


6
यदि आप सुनिश्चित नहीं हैं कि यह समझ में आता है, तो आप जो करना चाहते हैं उसके विशिष्ट उदाहरण प्रदान करने के लिए अपने प्रश्न को अपडेट करें।
एस.लॉट

जवाबों:


259

अपने विभाजक पर अधिकतम एक बार विभाजित करें, और पहला टुकड़ा लें:

sep = '...'
rest = text.split(sep, 1)[0]

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


अनुरोध है कि "विभाजक के बाद सभी पाठ को हटा दें, न कि" उस पाठ को "प्राप्त करें", इसलिए मुझे लगता है कि आप चाहते हैं [0], नहीं [-1], अन्यथा आपके उत्कृष्ट समाधान में।
एलेक्स मार्टेली

पूरी तरह से धन्यवाद काम किया, जैसा कि मुझे यकीन है कि आयमान और एलेक्स ने भी किया है, इसलिए आप सभी को धन्यवाद।
सोलहुल

5
यदि आप स्ट्रिंग के अंत से शुरू होने वाले चरित्र द्वारा विभाजित करने की आवश्यकता है, तो rsplit () का उपयोग करें।
शमूएल

rsplit () वास्तव में इस सवाल का जवाब देता है कि क्या विभाजक की कई घटनाएं होती हैं
Nate

94

मान लिया जाए कि आपका विभाजक '...' है, लेकिन यह कोई भी स्ट्रिंग हो सकता है।

text = 'some string... this part will be removed.'
head, sep, tail = text.partition('...')

>>> print head
some string

यदि विभाजक नहीं मिला है, headतो मूल स्ट्रिंग के सभी शामिल होंगे।

विभाजन समारोह पायथन 2.5 में जोड़ा गया था।

विभाजन (...) एस। विभाजन (एसईपी) -> (सिर, एसईपी, पूंछ)

Searches for the separator sep in S, and returns the part before it,
the separator itself, and the part after it.  If the separator is not
found, returns S and two empty strings.

अभी तक एक और उत्कृष्ट समाधान - क्या हम TOOOWTDI का उल्लंघन कर रहे हैं? -) शायद जाँच करने के लिए एक समय सीमा के लायक हो ...
एलेक्स मार्टेली

9
.partition जीतता है - 0.756 usec प्रति लूप, बनाम 1.13 के लिए .split (टिप्पणी स्वरूपण वास्तव में मुझे सटीक परीक्षण नहीं दिखाने देता है, लेकिन मैं @ अयमान के पाठ और विभाजक का उपयोग कर रहा हूं) - तो, ​​Ayman के उत्तर के लिए +1 !
एलेक्स मार्टेली

1
और btw, पूर्णता के लिए, आरई-आधारित समाधान 2.54 usec है, अर्थात, @ Ayman या @ नेड की तुलना में धीमी है।
एलेक्स मार्टेली

यदि आप 2.5 भूमि में हैं तो विभाजन जीतता है :) हमारे लिए 2.4 में अटके चूसने वाले, हमें विभाजन के अपेक्षाकृत हिमस्खलन के साथ रहना पड़ता है।
ग्रेग लिंड

उदाहरण वास्तव में मददगार है।
एमडी। सब्बीर अहमद

18

यदि आप एक स्ट्रिंग में विभाजक की अंतिम घटना के बाद सब कुछ निकालना चाहते हैं तो मुझे लगता है कि यह अच्छी तरह से काम करता है:

<separator>.join(string_to_split.split(<separator>)[:-1])

उदाहरण के लिए, यदि string_to_splitकोई रास्ता पसंद है root/location/child/too_far.exeऔर आप केवल फ़ोल्डर पथ चाहते हैं, तो आप विभाजित कर सकते हैं "/".join(string_to_split.split("/")[:-1])और आपको मिल जाएगा root/location/child


1
इसके अतिरिक्त, आप उस -1 को किसी भी अनुक्रमणिका में बदल सकते हैं, जिस पर आप पाठ छोड़ते हैं।
theannouncer

10

बिना आरई (जो मुझे लगता है कि आप चाहते हैं):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

या, एक आरई के साथ:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)

हो सकता है कि आप sep = '...' को kwarg के रूप में उपयोग करें और इसे थोड़ा और भविष्य-प्रूफ बनाने के लिए हार्ड-कोडिंग 3 के बजाय len (sep) का उपयोग करें।
cdleary

हां, लेकिन फिर आपको प्रत्येक कॉल पर आरई को फिर से इकट्ठा करने की आवश्यकता है, इसलिए प्रदर्शन आरई समाधान के लिए ग्रस्त है (गैर-आरई समाधान के लिए कोई वास्तविक अंतर नहीं)। कुछ सामान्य स्वतंत्र है, कुछ नहीं है ... ;-)
एलेक्स मार्टेली

@ एलेक्स - समाधान के परीक्षण के लिए धन्यवाद!
अयमान हुइह्र

2

विधि खोज एक स्ट्रिंग में वर्ण स्थिति लौटाएगा। फिर, यदि आप चरित्र से हर चीज़ को हटाना चाहते हैं, तो यह करें:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

यदि आप चरित्र को रखना चाहते हैं, तो चरित्र स्थिति में 1 जोड़ें।


1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

आउटपुट: "यह एक परीक्षा है"


कृपया स्पष्ट करें
lone_coder

1

एक फ़ाइल से:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)

0

फिर से उपयोग करने का एक और आसान तरीका होगा

import re, clr

text = 'some string... this part will be removed.'

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1)

// text = some string
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.