स्ट्रिंग में प्रतिस्थापित करने की नौवीं घटना का पता लगाएं


118

ऐसा लगता है कि यह बहुत तुच्छ होना चाहिए, लेकिन मैं पायथन में नया हूं और इसे सबसे ज्यादा पायथन तरीके से करना चाहता हूं।

मैं एक स्ट्रिंग के भीतर एक विकल्प की n 'घटना के अनुरूप सूचकांक ढूंढना चाहता हूं।

वहाँ कुछ है जो मैं क्या करना चाहता हूँ के बराबर हो गया है

mystring.find("substring", 2nd)

आप इसे पायथन में कैसे प्राप्त कर सकते हैं?


7
स्ट्रिंग की n'th घटना ज्ञात कीजिये? मुझे लगता है कि यह n'th घटना का सूचकांक है?
मार्क बायर्स

2
हाँ, n'th घटना का सूचकांक
prestomation 21

9
ओवरलैपिंग मैच होने पर क्या होना चाहिए? Find_nth ('आना', 'आ', 2) 1 या 2 वापस करना चाहिए?
मार्क बायर्स

हाँ! स्ट्रिंग में एक सबरिंग की n'th घटना को खोजने और स्ट्रिंग की n'th घटना पर स्ट्रिंग को विभाजित करने के लिए कुछ होने के लिए कुछ है।
रिमां

जवाबों:


69

मुझे लगता है कि मार्क का पुनरावृत्ति दृष्टिकोण सामान्य तरीका होगा।

यहां स्ट्रिंग-विभाजन के साथ एक विकल्प है, जो अक्सर खोज-संबंधित प्रक्रियाओं के लिए उपयोगी हो सकता है:

def findnth(haystack, needle, n):
    parts= haystack.split(needle, n+1)
    if len(parts)<=n+1:
        return -1
    return len(haystack)-len(parts[-1])-len(needle)

और यहाँ एक त्वरित (और कुछ हद तक गंदा है, इसमें आपको कुछ चैफ चुनना होगा जो सुई से मेल नहीं खा सकते हैं) एक-लाइनर:

'foo bar bar bar'.replace('bar', 'XXX', 1).find('bar')

7
पहला सुझाव बड़े स्ट्रिंग्स के लिए बहुत ही अक्षम होने वाला है जब आप जिस मैच में रुचि रखते हैं वह शुरुआत के करीब है। यह हमेशा पूरे स्ट्रिंग को देखता है। यह चतुर है, लेकिन मैं इसे किसी ऐसे व्यक्ति को नहीं सुझाऊंगा जो पायथन के लिए नया है और वह इसे करने का एक अच्छा तरीका सीखना चाहता है।
मार्क बायर्स

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

1
एक-लाइनर के लिए +1, इससे मुझे अभी मदद करनी चाहिए। मैं के बराबर करने के बारे में सोच रहा था .rfind('XXX'), लेकिन अगर 'XXX'बाद में इनपुट में दिखाई देता है तो वह अलग हो जाएगा ।
निखिल चेलियाह

यह फ़ंक्शन मान = 0, 1, 2, 3, ... यह अच्छा होगा कि आप मान लें n = 1, 2, 3, 4, ...
हैप्पी

75

यहाँ सीधे पुनरावृत्ति समाधान का एक और पायथनिक संस्करण है:

def find_nth(haystack, needle, n):
    start = haystack.find(needle)
    while start >= 0 and n > 1:
        start = haystack.find(needle, start+len(needle))
        n -= 1
    return start

उदाहरण:

>>> find_nth("foofoofoofoo", "foofoo", 2)
6

यदि आप एनटी ओवरलैपिंग की घटना का पता लगाना चाहते हैं needle, तो आप 1इसके बजाय वृद्धि कर सकते हैं len(needle):

def find_nth_overlapping(haystack, needle, n):
    start = haystack.find(needle)
    while start >= 0 and n > 1:
        start = haystack.find(needle, start+1)
        n -= 1
    return start

उदाहरण:

>>> find_nth_overlapping("foofoofoofoo", "foofoo", 2)
3

यह मार्क के संस्करण की तुलना में पढ़ना आसान है, और इसे विभाजन संस्करण की अतिरिक्त मेमोरी या नियमित अभिव्यक्ति मॉड्यूल आयात करने की आवश्यकता नहीं है। यह विभिन्न दृष्टिकोणों के विपरीत, अजगर के ज़ेन में कुछ नियमों का पालन करता है re:

  1. सरल जटिल से बेहतर है।
  2. फ्लैट नेस्टेड से बेहतर है।
  3. पठनीयता मायने रखती है।

क्या यह एक तार में किया जा सकता है? जैसे find_nth (df.mystring.str, ('x'), 2) 'x' के दूसरे उदाहरण की स्थिति ज्ञात करने के लिए?
आर्थर डी। हॉवेल

36

यह स्ट्रिंग में प्रतिस्थापन की दूसरी घटना का पता लगाएगा।

def find_2nd(string, substring):
   return string.find(substring, string.find(substring) + 1)

संपादित करें: मैंने प्रदर्शन के बारे में ज्यादा नहीं सोचा है, लेकिन एक त्वरित पुनरावृत्ति एनटी घटना को खोजने में मदद कर सकती है:

def find_nth(string, substring, n):
   if (n == 1):
       return string.find(substring)
   else:
       return string.find(substring, find_nth(string, substring, n - 1) + 1)

क्या यह आमतौर पर n-वें तत्व को खोजने के लिए बढ़ाया जा सकता है?
ifly6

यह सबसे अच्छा उत्तर IMHO है, मैंने उस विशेष मामले के लिए एक छोटा सा जोड़ दिया जहाँ n = 0
Jan Wilmans

मैं संक्षिप्तता के लिए पोस्ट संपादित नहीं करना चाहता था। मैं आपसे सहमत हूँ हालांकि, उस n = 0 को एक विशेष मामले के रूप में माना जाना चाहिए।
श्रीराम मुरली

इस मामले को संभालने के लिए समायोजित किया जाना चाहिए जहां nसबस्ट्रिंग की घटनाओं से कम है । (इस मामले में रिटर्न वैल्यू समय-समय पर सभी घटना पदों के माध्यम से चक्रित होगी)।
कोल्डफिक्स

29

यह समझना कि रेगेक्स हमेशा सबसे अच्छा समाधान नहीं है, मैं शायद यहां एक का उपयोग करूंगा:

>>> import re
>>> s = "ababdfegtduab"
>>> [m.start() for m in re.finditer(r"ab",s)]
[0, 2, 11]
>>> [m.start() for m in re.finditer(r"ab",s)][2] #index 2 is third occurrence 
11

4
यहाँ जोखिम यह है कि स्ट्रिंग को खोजने के लिए विशेष वर्ण शामिल होंगे जो regex को कुछ ऐसा करने का कारण होगा जो आप नहीं चाहते थे। Re.escape का उपयोग करके इसे हल करना चाहिए।
मार्क बायर्स

1
यह चतुर है, लेकिन क्या यह वास्तव में पायथन है? सिर्फ एक विकल्प की nth घटना को खोजने के लिए overkill की तरह लगता है, और यह पढ़ने के लिए बिल्कुल आसान नहीं है। इसके अलावा, जैसा कि आप कहते हैं, आपको इसके लिए सभी को फिर से आयात करना होगा
टोड गैंबलिन

जब आप वर्ग कोष्ठक का उपयोग करते हैं, तो आप पायथन को पूरी सूची बनाने के लिए कहते हैं। गोल कोष्ठक केवल पहले तत्वों के माध्यम से पुनरावृत्ति करेगा, जो अधिक प्रभावी है:(m.start() for m in re.finditer(r"ab",s))[2]
इमू

1
@emu नहीं, आपने जो पोस्ट किया है वह काम नहीं करेगा; आप जनरेटर का इंडेक्स नहीं ले सकते।
मार्क अमेरी

@ मार्की क्षमा करें! मैं काफी हैरान हूं कि मैंने वह कोड क्यों पोस्ट किया। फिर भी, itertools.isliceफ़ंक्शन का उपयोग करके एक समान और बदसूरत समाधान संभव है :next(islice(re.finditer(r"ab",s), 2, 2+1)).start()
इमू

17

मैं अब तक प्रस्तुत सबसे प्रमुख दृष्टिकोणों की तुलना में कुछ बेंचमार्किंग परिणाम पेश कर रहा हूं, जिसका नाम @ bobince findnth()(पर आधारित str.split()) बनाम @ tgamblin's या @Mark बायर्स ' find_nth()(पर आधारित str.find()) है। मैं सी एक्सटेंशन ( _find_nth.so) के साथ तुलना करके देखूंगा कि हम कितनी तेजी से जा सकते हैं। यहाँ है find_nth.py:

def findnth(haystack, needle, n):
    parts= haystack.split(needle, n+1)
    if len(parts)<=n+1:
        return -1
    return len(haystack)-len(parts[-1])-len(needle)

def find_nth(s, x, n=0, overlap=False):
    l = 1 if overlap else len(x)
    i = -l
    for c in xrange(n + 1):
        i = s.find(x, i + l)
        if i < 0:
            break
    return i

बेशक, प्रदर्शन सबसे ज्यादा मायने रखता है अगर स्ट्रिंग बड़ी है, तो मान लीजिए कि हम 'बिगफाइल' नामक 1.3 जीबी फाइल में 1000001 वीं नईलाइन ('\ n') को ढूंढना चाहते हैं। मेमोरी को बचाने के लिए, हम mmap.mmapफ़ाइल के ऑब्जेक्ट प्रतिनिधित्व पर काम करना चाहेंगे :

In [1]: import _find_nth, find_nth, mmap

In [2]: f = open('bigfile', 'r')

In [3]: mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

ऑब्जेक्ट्स का समर्थन नहीं करने के findnth()बाद से पहले से ही पहली समस्या है । इसलिए हमें वास्तव में पूरी फाइल को मेमोरी में कॉपी करना होगा:mmap.mmapsplit()

In [4]: %time s = mm[:]
CPU times: user 813 ms, sys: 3.25 s, total: 4.06 s
Wall time: 17.7 s

आउच! सौभाग्य से sअभी भी मेरी मैकबुक एयर की 4 जीबी मेमोरी में फिट है, तो चलो मानदंड findnth():

In [5]: %timeit find_nth.findnth(s, '\n', 1000000)
1 loops, best of 3: 29.9 s per loop

स्पष्ट रूप से एक भयानक प्रदर्शन। आइए देखें कि यह कैसे str.find()करता है:

In [6]: %timeit find_nth.find_nth(s, '\n', 1000000)
1 loops, best of 3: 774 ms per loop

काफी बेहतर! स्पष्ट रूप से, findnth()समस्या यह है कि यह स्ट्रिंग को कॉपी करने के लिए मजबूर किया जाता है split(), जो पहले से ही दूसरी बार है जब हमने 1.3 जीबी डेटा की प्रतिलिपि बनाई s = mm[:]। यहां दूसरा फायदा मिलता है find_nth(): हम इसे mmसीधे उपयोग कर सकते हैं , जैसे कि फ़ाइल की शून्य प्रतियां आवश्यक हैं:

In [7]: %timeit find_nth.find_nth(mm, '\n', 1000000)
1 loops, best of 3: 1.21 s per loop

ऐसा प्रतीत होता है कि यह एक छोटा सा प्रदर्शन है , जो mmबनाम पर चल रहा है s, लेकिन यह दिखाता है कि find_nth()हमें findnth47 के कुल योग की तुलना में 1.2 सेकंड में जवाब मिल सकता है ।

मुझे ऐसा कोई मामला नहीं मिला जहां str.find()आधारित दृष्टिकोण आधारित दृष्टिकोण से काफी खराब था str.split(), इसलिए इस बिंदु पर, मैं तर्क दूंगा कि @ tgamblin या @Mark बायर्स का उत्तर @ bobince के बजाय स्वीकार किया जाना चाहिए।

मेरे परीक्षण में, find_nth()ऊपर का संस्करण सबसे तेज शुद्ध पायथन समाधान था जो मैं (@ बार्क बायर्स संस्करण के समान) के साथ आ सकता था। आइए देखें कि हम सी एक्सटेंशन मॉड्यूल के साथ कितना बेहतर कर सकते हैं। यहाँ है _find_nthmodule.c:

#include <Python.h>
#include <string.h>

off_t _find_nth(const char *buf, size_t l, char c, int n) {
    off_t i;
    for (i = 0; i < l; ++i) {
        if (buf[i] == c && n-- == 0) {
            return i;
        }
    }
    return -1;
}

off_t _find_nth2(const char *buf, size_t l, char c, int n) {
    const char *b = buf - 1;
    do {
        b = memchr(b + 1, c, l);
        if (!b) return -1;
    } while (n--);
    return b - buf;
}

/* mmap_object is private in mmapmodule.c - replicate beginning here */
typedef struct {
    PyObject_HEAD
    char *data;
    size_t size;
} mmap_object;

typedef struct {
    const char *s;
    size_t l;
    char c;
    int n;
} params;

int parse_args(PyObject *args, params *P) {
    PyObject *obj;
    const char *x;

    if (!PyArg_ParseTuple(args, "Osi", &obj, &x, &P->n)) {
        return 1;
    }
    PyTypeObject *type = Py_TYPE(obj);

    if (type == &PyString_Type) {
        P->s = PyString_AS_STRING(obj);
        P->l = PyString_GET_SIZE(obj);
    } else if (!strcmp(type->tp_name, "mmap.mmap")) {
        mmap_object *m_obj = (mmap_object*) obj;
        P->s = m_obj->data;
        P->l = m_obj->size;
    } else {
        PyErr_SetString(PyExc_TypeError, "Cannot obtain char * from argument 0");
        return 1;
    }
    P->c = x[0];
    return 0;
}

static PyObject* py_find_nth(PyObject *self, PyObject *args) {
    params P;
    if (!parse_args(args, &P)) {
        return Py_BuildValue("i", _find_nth(P.s, P.l, P.c, P.n));
    } else {
        return NULL;    
    }
}

static PyObject* py_find_nth2(PyObject *self, PyObject *args) {
    params P;
    if (!parse_args(args, &P)) {
        return Py_BuildValue("i", _find_nth2(P.s, P.l, P.c, P.n));
    } else {
        return NULL;    
    }
}

static PyMethodDef methods[] = {
    {"find_nth", py_find_nth, METH_VARARGS, ""},
    {"find_nth2", py_find_nth2, METH_VARARGS, ""},
    {0}
};

PyMODINIT_FUNC init_find_nth(void) {
    Py_InitModule("_find_nth", methods);
}

यहाँ setup.pyफ़ाइल है:

from distutils.core import setup, Extension
module = Extension('_find_nth', sources=['_find_nthmodule.c'])
setup(ext_modules=[module])

हमेशा की तरह स्थापित करें python setup.py install। C कोड यहाँ एक लाभ पर खेलता है क्योंकि यह एकल वर्णों को खोजने तक सीमित है, लेकिन देखते हैं कि यह कितना तेज़ है:

In [8]: %timeit _find_nth.find_nth(mm, '\n', 1000000)
1 loops, best of 3: 218 ms per loop

In [9]: %timeit _find_nth.find_nth(s, '\n', 1000000)
1 loops, best of 3: 216 ms per loop

In [10]: %timeit _find_nth.find_nth2(mm, '\n', 1000000)
1 loops, best of 3: 307 ms per loop

In [11]: %timeit _find_nth.find_nth2(s, '\n', 1000000)
1 loops, best of 3: 304 ms per loop

स्पष्ट रूप से अभी भी थोड़ा बहुत तेज है। दिलचस्प बात यह है कि इन-मेमरी और एमएमपीड मामलों के बीच सी स्तर पर कोई अंतर नहीं है। यह भी देखना होगा कि दिलचस्प है _find_nth2(), जो पर आधारित है string.hके memchr()पुस्तकालय समारोह, में सीधा कार्यान्वयन के खिलाफ खो देता है _find_nth(): में अतिरिक्त "अनुकूलन" memchr()जाहिरा तौर पर backfiring कर रहे हैं ...

अंत में, findnth()(पर आधारित str.split()) में कार्यान्वयन वास्तव में एक बुरा विचार है, क्योंकि (ए) यह आवश्यक प्रतिलिपि के कारण बड़े तारों के लिए बहुत अच्छा प्रदर्शन करता है, और (बी) यह mmap.mmapवस्तुओं पर बिल्कुल काम नहीं करता है । सभी परिस्थितियों में कार्यान्वयन find_nth()(पर आधारित str.find()) को प्राथमिकता दी जानी चाहिए (और इसलिए इस प्रश्न का स्वीकृत उत्तर होना चाहिए)।

सुधार के लिए अभी भी काफी जगह है, क्योंकि सी एक्सटेंशन शुद्ध पायथन कोड की तुलना में लगभग 4 गुना तेज है, यह दर्शाता है कि एक समर्पित पायथन लाइब्रेरी फ़ंक्शन के लिए एक मामला हो सकता है।


8

सबसे सरल तरीका?

text = "This is a test from a test ok" 

firstTest = text.find('test')

print text.find('test', firstTest + 1)

मैं सोच सकता हूं कि अन्य समाधानों की तुलना में यह काफी अच्छा है।
रोटेरेटी

7

मैं शायद ऐसा कुछ करूंगा, एक इंडेक्स पैरामीटर लेने वाले फ़ंक्शन का उपयोग करके:

def find_nth(s, x, n):
    i = -1
    for _ in range(n):
        i = s.find(x, i + len(x))
        if i == -1:
            break
    return i

print find_nth('bananabanana', 'an', 3)

यह विशेष रूप से पाइथोनिक नहीं है जो मुझे लगता है, लेकिन यह सरल है। आप इसके बजाय पुनरावृत्ति का उपयोग कर सकते हैं:

def find_nth(s, x, n, i = 0):
    i = s.find(x, i)
    if n == 1 or i == -1:
        return i 
    else:
        return find_nth(s, x, n - 1, i + len(x))

print find_nth('bananabanana', 'an', 3)

यह इसे हल करने का एक कार्यात्मक तरीका है, लेकिन मुझे नहीं पता कि क्या यह अधिक पायथोनिक बनाता है।


1
for _ in xrange(n):के बजाय इस्तेमाल किया जा सकता हैwhile n: ... n-=1
jfs

@ जेएफ सेबस्टियन: हाँ, मुझे लगता है कि यह थोड़ा अधिक पायथोनिक है। मैं अपडेट करूंगा।
मार्क बायर्स

BTW: Python 3 में xrange की अब आवश्यकता नहीं है: diveintopython3.org/…
मार्क बायर्स

1
return find_nth(s, x, n - 1, i + 1)होना चाहिए return find_nth(s, x, n - 1, i + len(x))। कोई बड़ी बात नहीं है, लेकिन कुछ गणना समय बचाता है।
डैन लोवेनहेर्ज़

@ डलो: वास्तव में जो कुछ मामलों में अलग-अलग परिणाम दे सकता है: find_nth ('आआआ', 'आ', 2)। मेरा 1 देता है, तुम्हारा 2 देता है। मुझे लगता है कि तुम्हारा वास्तव में पोस्टर क्या चाहता है। मैं अपना कोड अपडेट कर दूंगा। टिप्पणी के लिए धन्यवाद।
मार्क बायर्स

3

इससे आपको मैचों के लिए शुरुआती सूचकांकों की एक सरणी मिलेगी yourstring:

import re
indices = [s.start() for s in re.finditer(':', yourstring)]

तब आपकी nth प्रविष्टि होगी:

n = 2
nth_entry = indices[n-1]

बेशक आपको इंडेक्स सीमा से सावधान रहना होगा। आप yourstringइस तरह के उदाहरणों की संख्या प्राप्त कर सकते हैं :

num_instances = len(indices)

2

यहाँ re.finditer का उपयोग करके एक और तरीका बताया गया है।
अंतर यह है कि यह केवल जहाँ तक आवश्यक हो, धड़ल्ले से दिखता है

from re import finditer
from itertools import dropwhile
needle='an'
haystack='bananabanana'
n=2
next(dropwhile(lambda x: x[0]<n, enumerate(re.finditer(needle,haystack))))[1].start() 

2

यहां एक और re+ itertoolsसंस्करण है जो strया तो एक या एक के लिए खोज करते समय काम करना चाहिए RegexpObject। मैं स्वतंत्र रूप से स्वीकार करूंगा कि यह संभावना से अधिक इंजीनियर है, लेकिन किसी कारण से इसने मेरा मनोरंजन किया।

import itertools
import re

def find_nth(haystack, needle, n = 1):
    """
    Find the starting index of the nth occurrence of ``needle`` in \
    ``haystack``.

    If ``needle`` is a ``str``, this will perform an exact substring
    match; if it is a ``RegexpObject``, this will perform a regex
    search.

    If ``needle`` doesn't appear in ``haystack``, return ``-1``. If
    ``needle`` doesn't appear in ``haystack`` ``n`` times,
    return ``-1``.

    Arguments
    ---------
    * ``needle`` the substring (or a ``RegexpObject``) to find
    * ``haystack`` is a ``str``
    * an ``int`` indicating which occurrence to find; defaults to ``1``

    >>> find_nth("foo", "o", 1)
    1
    >>> find_nth("foo", "o", 2)
    2
    >>> find_nth("foo", "o", 3)
    -1
    >>> find_nth("foo", "b")
    -1
    >>> import re
    >>> either_o = re.compile("[oO]")
    >>> find_nth("foo", either_o, 1)
    1
    >>> find_nth("FOO", either_o, 1)
    1
    """
    if (hasattr(needle, 'finditer')):
        matches = needle.finditer(haystack)
    else:
        matches = re.finditer(re.escape(needle), haystack)
    start_here = itertools.dropwhile(lambda x: x[0] < n, enumerate(matches, 1))
    try:
        return next(start_here)[1].start()
    except StopIteration:
        return -1

2

Modle13 के उत्तर पर निर्माण , लेकिन reमॉड्यूल निर्भरता के बिना ।

def iter_find(haystack, needle):
    return [i for i in range(0, len(haystack)) if haystack[i:].startswith(needle)]

मुझे लगता है कि यह एक अंतर्निहित स्ट्रिंग विधि थी।

>>> iter_find("http://stackoverflow.com/questions/1883980/", '/')
[5, 6, 24, 34, 42]

1
>>> s="abcdefabcdefababcdef"
>>> j=0
>>> for n,i in enumerate(s):
...   if s[n:n+2] =="ab":
...     print n,i
...     j=j+1
...     if j==2: print "2nd occurence at index position: ",n
...
0 a
6 a
2nd occurence at index position:  6
12 a
14 a

1

एक और "मुश्किल" समाधान प्रदान करना, जो उपयोग करता है splitऔरjoin

आपके उदाहरण में, हम उपयोग कर सकते हैं

len("substring".join([s for s in ori.split("substring")[:2]]))

1
# return -1 if nth substr (0-indexed) d.n.e, else return index
def find_nth(s, substr, n):
    i = 0
    while n >= 0:
        n -= 1
        i = s.find(substr, i + 1)
    return i

स्पष्टीकरण की आवश्यकता है
Ctznkane525

find_nth('aaa', 'a', 0)लौटते 1समय लौटना चाहिए 0। आपको कुछ चाहिए i = s.find(substr, i) + 1और फिर वापस लौट आना चाहिए i - 1
a_guest जुआन

1

लूप और पुनरावृत्ति का उपयोग किए बिना समाधान।

संकलित विधि में आवश्यक पैटर्न का उपयोग करें और चर and एन ’ में वांछित घटना दर्ज करें और अंतिम विवरण दिए गए स्ट्रिंग में पैटर्न की nth घटना के शुरुआती सूचकांक को प्रिंट करेगा। यहाँ खोजक अर्थात पुनरावृत्त का परिणाम सूची में परिवर्तित किया जा रहा है और सीधे nth इंडेक्स तक पहुँचा जा रहा है।

import re
n=2
sampleString="this is history"
pattern=re.compile("is")
matches=pattern.finditer(sampleString)
print(list(matches)[n].span()[0])

1

उस विशेष मामले के लिए जहां आप किसी वर्ण की n'th घटना के लिए खोज करते हैं (अर्थात लंबाई 1 का विकल्प), निम्न फ़ंक्शन दिए गए वर्ण के सभी स्थितियों की सूची बनाकर काम करता है:

def find_char_nth(string, char, n):
    """Find the n'th occurence of a character within a string."""
    return [i for i, c in enumerate(string) if c == char][n-1]

यदि nदिए गए चरित्र की घटनाओं से कम हैं , तो यह देगा IndexError: list index out of range

यह @ Zv_oDD के उत्तर से लिया गया है और एकल वर्ण के मामले के लिए सरल है।



0

प्रतिस्थापित एक लाइनर महान है, लेकिन केवल काम करता है क्योंकि XX और बार में एक ही लेंटेज होता है

एक अच्छा और सामान्य बचाव होगा:

def findN(s,sub,N,replaceString="XXX"):
    return s.replace(sub,replaceString,N-1).find(sub) - (len(replaceString)-len(sub))*(N-1)

0

यह वह उत्तर है जो आप वास्तव में चाहते हैं:

def Find(String,ToFind,Occurence = 1):
index = 0 
count = 0
while index <= len(String):
    try:
        if String[index:index + len(ToFind)] == ToFind:
            count += 1
        if count == Occurence:
               return index
               break
        index += 1
    except IndexError:
        return False
        break
return False

0

यहाँ स्ट्रिंग में nवें घटना को खोजने के लिए मेरा समाधान है :ba

from functools import reduce


def findNth(a, b, n):
    return reduce(lambda x, y: -1 if y > x + 1 else a.find(b, x + 1), range(n), -1)

यह शुद्ध पायथन और पुनरावृति है। 0 के लिए या nयह बहुत बड़ा है, यह -1 देता है। यह वन-लाइनर है और इसे सीधे इस्तेमाल किया जा सकता है। यहाँ एक उदाहरण है:

>>> reduce(lambda x, y: -1 if y > x + 1 else 'bibarbobaobaotang'.find('b', x + 1), range(4), -1)
7

0

डेफ:

def get_first_N_words(mytext, mylen = 3):
    mylist = list(mytext.split())
    if len(mylist)>=mylen: return ' '.join(mylist[:mylen])

काम में लाना:

get_first_N_words('  One Two Three Four ' , 3)

आउटपुट:

'One Two Three'

-2

कैसा रहेगा:

c = os.getcwd().split('\\')
print '\\'.join(c[0:-2])

यह प्रारंभिक प्रश्न का उत्तर नहीं है
जेरजेक

यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ; इसके बजाय, ऐसे उत्तर प्रदान करें जिन्हें पूछने वाले से स्पष्टीकरण की आवश्यकता न हो
जेरजक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.