নির্দিষ্ট স্ট্রিংয়ের পরে স্ট্রিং কীভাবে পাবেন?


226

নির্দিষ্ট স্ট্রিংয়ের পরে আমি কীভাবে স্ট্রিং পেতে পারি?

উদাহরণস্বরূপ, আমি পরে স্ট্রিং পেতে চান "world"মধ্যেmy_string="hello python world , i'm a beginner "

উত্তর:


399

সবচেয়ে সহজ উপায় সম্ভবত আপনার লক্ষ্য শব্দের উপর বিভক্ত হয়

my_string="hello python world , i'm a beginner "
print my_string.split("world",1)[1] 

বিভাজকটি শব্দটি (বা চরিত্রের) উপর বিভক্ত হয় এবং allyচ্ছিকভাবে বিভক্তির সংখ্যার সীমা থাকে।

এই উদাহরণে "ওয়ার্ল্ড" বিভক্ত করুন এবং এটি কেবল একটি বিভাজনের মধ্যে সীমাবদ্ধ করুন।


আমার যদি 'কম' শব্দের সাথে কোনও পাঠ্যকে বিভক্ত করতে হয় এবং এটির আগে এটি শব্দটি কম থাকে তবে এটি কার্যকর হবে না!
লিওনার্দো হারমোসো

1
আপনি সরলভাবে 2x বিভক্ত করবেনtarget.split('lower',1)[-1].split('low',1)[-1]
জোড়ান বিসলে

"হ্যালো পাইথন মেগাওয়ার্ল্ড ওয়ার্ল্ড, আমি একজন শিক্ষানবিস" হলে এই বাক্যটি কী ছিল। আমি কীভাবে এটি পুরো শব্দটির দিকে নজর দিতে পারি এবং 'মেগাওয়ার্ড' হিসাবে অন্যটির অংশ না হয়ে পারি? ধন্যবাদ
pbou

1
তারপরে আপনি যে স্ট্রিংটি সন্ধান করছেন তা হ'ল "বিশ্ব" ... বা শব্দের সীমানার জন্য রেজেক্স ব্যবহার করুন
বিসলে

6
my_string.partition("world")[-1](বা ...[2]) দ্রুত।
মার্টিজন পিটারস

66
s1 = "hello python world , i'm a beginner "
s2 = "world"

print s1[s1.index(s2) + len(s2):]

আপনি সাথে মোকাবিলা করতে চান, যেখানে s2হয় না বর্তমান s1, তারপর ব্যবহার s1.find(s2)যেমন উল্টোদিকে index। যদি সেই কলটির রিটার্ন মান হয় -1তবে s2তা এতে নেই s1


আপনি স্বতন্ত্র আইডি পেয়েছেন (যা কয়েক হাজার দ্বারা পৃথক করা হয়েছে) ... আমি নিশ্চিত না যে আপনি এটি দিয়ে অযৌক্তিক সাবস্ট্রিং তৈরি করবেন না
জোড়ান বিসলে

@ জোড়ান বিসলে, আমরা কেবল সূচক (), লেন () এবং স্লাইস কল করি। সূচিকা () এবং লেন () সাবস্ট্রিংগুলি তৈরি করার কোনও কারণ নেই এবং যদি তারা (আমার বিশ্বাস করা শক্ত হয়) তবে এটি কেবল একটি অপ্রয়োজনীয় বাস্তবায়ন বিশদ। টুকরো জন্য একই - এটি ফিরে আসা ব্যতীত সাবস্ট্রিংগুলি তৈরি করার কোনও কারণ নেই।
shx2

@ shx2print( s1[s1.index(s2) + len(s2):] is s1[s1.index(s2) + len(s2):])
বিসলে

@ জোড়ান বিসলে আপনি এই স্নিপেট দিয়ে কোন পয়েন্টটি তৈরি করার চেষ্টা করছেন? যে একাধিক কল বিভিন্ন জিনিস ফিরে আসে? "অপ্রয়োজনীয় সাবস্ট্রিংস" বলতে বোঝায় যেটি এসেছে তার ব্যতীত অন্য সাবস্ট্রিংগুলি অর্থাত্ সাবস্ট্রিংগুলি যা ফলাফল অর্জনের জন্য তৈরি করা প্রয়োজন নয়।
shx2

56

আমি অবাক হয়েছি কেউ উল্লেখ করেনি partition

def substring_after(s, delim):
    return s.partition(delim)[2]

আইএমএইচও, এই সমাধানটি @ আরশাজীর চেয়ে বেশি পঠনযোগ্য। এগুলি বাদে, আমি মনে করি @ আর্শাজিই দ্রুততম হওয়ার জন্য সেরা - এটি কোনও অপ্রয়োজনীয় অনুলিপি / সাবস্ট্রিং তৈরি করে না।


2
এটি একটি দুর্দান্ত সমাধান, এবং স্ট্রিংগুলি বেস স্ট্রিংয়ের অংশটি সুন্দরভাবে নয় এমন ক্ষেত্রে পরিচালনা করে।
mattmc3

আপনি স্বতন্ত্র আইডির (যা কয়েক হাজার দ্বারা পৃথক পৃথক) পেয়েছেন ... আমি নিশ্চিত নই যে আপনি এটি দিয়ে অযৌক্তিক সাবস্ট্রিং তৈরি করবেন না (এবং এটির সঠিকভাবে প্রোফাইল দিতে আমি খুব
অলসও

1
@ জোড়ান বিসলে, এটি পরিষ্কারভাবে অপ্রয়োজনীয় সাবস্টিং তৈরি করে । আমার মনে হয় আপনি আমার উত্তর ভুল লিখেছেন।
shx2

(আরশির আমিও ভাবি ...)
জোড়ান ব্যাসলি

3
তদুপরি, এই তুলনায় দ্রুতstr.split(..., 1)
মার্টিজন পিটারস

20

আপনি ব্যবহার করতে চান str.partition():

>>> my_string.partition("world")[2]
" , i'm a beginner "

কারণ এই বিকল্পটি বিকল্পগুলির চেয়ে দ্রুত

মনে রাখবেন যে ডিলিমিটারটি অনুপস্থিত থাকলে এটি একটি খালি স্ট্রিং উত্পাদন করে:

>>> my_string.partition("Monty")[2]  # delimiter missing
''

যদি আপনি মূল স্ট্রিংটি রাখতে চান, তবে দ্বিতীয় মানটি যদি str.partition()খালি না থেকে ফিরে আসে তবে পরীক্ষা করুন :

prefix, success, result = my_string.partition(delimiter)
if not success: result = prefix

আপনি str.split()1 এর সীমাতেও ব্যবহার করতে পারেন :

>>> my_string.split("world", 1)[-1]
" , i'm a beginner "
>>> my_string.split("Monty", 1)[-1]  # delimiter missing
"hello python world , i'm a beginner "

তবে এই বিকল্পটি ধীর । সেরা-কেস দৃশ্যের str.partition()জন্য তুলনায় সহজেই প্রায় 15% দ্রুতstr.split() :

                                missing        first         lower         upper          last
      str.partition(...)[2]:  [3.745 usec]  [0.434 usec]  [1.533 usec]  <3.543 usec>  [4.075 usec]
str.partition(...) and test:   3.793 usec    0.445 usec    1.597 usec    3.208 usec    4.170 usec
      str.split(..., 1)[-1]:  <3.817 usec>  <0.518 usec>  <1.632 usec>  [3.191 usec]  <4.173 usec>
            % best vs worst:         1.9%         16.2%          6.1%          9.9%          2.3%

এটি ইনপুটগুলির সাথে মৃত্যুদন্ড কার্যকর করার সময় দেখায় এখানে ডিলিমিটারটি অনুপস্থিত (সবচেয়ে খারাপ পরিস্থিতি), প্রথম স্থানে রাখা হয়েছে (সেরা ক্ষেত্রে) বা নীচের অর্ধেক, উপরের অর্ধেক বা শেষ অবস্থানে। দ্রুততম সময়ের সাথে সাথে চিহ্নিত করা হয় [...]এবং<...> সবচেয়ে খারাপ চিহ্নিত করে।

উপরের টেবিলটি নীচে উত্পাদিত তিনটি বিকল্পের জন্য একটি বিস্তৃত সময় ট্রায়াল দ্বারা উত্পাদিত হয়েছে। আমি পাইথন 3.7.4 এ একটি 2017 মডেল 15 "ম্যাকবুক প্রোতে 2.9 গিগাহার্টজ ইন্টেল কোর আই 7 এবং 16 জিবি র‌্যাম নিয়ে পরীক্ষা করেছি।

এই স্ক্রিপ্টটি এলোমেলোভাবে নির্বাচিত ডিলিমিটার উপস্থিতির সাথে এবং ছাড়া এলোমেলো বাক্য উত্পন্ন করে এবং যদি উপস্থিত থাকে তবে উত্পন্ন বাক্যটির বিভিন্ন অবস্থানে পুনরাবৃত্তিগুলির সাথে এলোমেলোভাবে ক্রম পরীক্ষা করে (পরীক্ষার সময় সংঘটিত এলোমেলো ওএস ইভেন্টগুলির জন্য সুনির্দিষ্ট ফলাফলের হিসাব), এবং তারপরে ফলাফলগুলির একটি সারণী মুদ্রণ করে:

import random
from itertools import product
from operator import itemgetter
from pathlib import Path
from timeit import Timer

setup = "from __main__ import sentence as s, delimiter as d"
tests = {
    "str.partition(...)[2]": "r = s.partition(d)[2]",
    "str.partition(...) and test": (
        "prefix, success, result = s.partition(d)\n"
        "if not success: result = prefix"
    ),
    "str.split(..., 1)[-1]": "r = s.split(d, 1)[-1]",
}

placement = "missing first lower upper last".split()
delimiter_count = 3

wordfile = Path("/usr/dict/words")  # Linux
if not wordfile.exists():
    # macos
    wordfile = Path("/usr/share/dict/words")
words = [w.strip() for w in wordfile.open()]

def gen_sentence(delimiter, where="missing", l=1000):
    """Generate a random sentence of length l

    The delimiter is incorporated according to the value of where:

    "missing": no delimiter
    "first":   delimiter is the first word
    "lower":   delimiter is present in the first half
    "upper":   delimiter is present in the second half
    "last":    delimiter is the last word

    """
    possible = [w for w in words if delimiter not in w]
    sentence = random.choices(possible, k=l)
    half = l // 2
    if where == "first":
        # best case, at the start
        sentence[0] = delimiter
    elif where == "lower":
        # lower half
        sentence[random.randrange(1, half)] = delimiter
    elif where == "upper":
        sentence[random.randrange(half, l)] = delimiter
    elif where == "last":
        sentence[-1] = delimiter
    # else: worst case, no delimiter

    return " ".join(sentence)

delimiters = random.choices(words, k=delimiter_count)
timings = {}
sentences = [
    # where, delimiter, sentence
    (w, d, gen_sentence(d, w)) for d, w in product(delimiters, placement)
]
test_mix = [
    # label, test, where, delimiter sentence
    (*t, *s) for t, s in product(tests.items(), sentences)
]
random.shuffle(test_mix)

for i, (label, test, where, delimiter, sentence) in enumerate(test_mix, 1):
    print(f"\rRunning timed tests, {i:2d}/{len(test_mix)}", end="")
    t = Timer(test, setup)
    number, _ = t.autorange()
    results = t.repeat(5, number)
    # best time for this specific random sentence and placement
    timings.setdefault(
        label, {}
    ).setdefault(
        where, []
    ).append(min(dt / number for dt in results))

print()

scales = [(1.0, 'sec'), (0.001, 'msec'), (1e-06, 'usec'), (1e-09, 'nsec')]
width = max(map(len, timings))
rows = []
bestrow = dict.fromkeys(placement, (float("inf"), None))
worstrow = dict.fromkeys(placement, (float("-inf"), None))

for row, label in enumerate(tests):
    columns = []
    worst = float("-inf")
    for p in placement:
        timing = min(timings[label][p])
        if timing < bestrow[p][0]:
            bestrow[p] = (timing, row)
        if timing > worstrow[p][0]:
            worstrow[p] = (timing, row)
        worst = max(timing, worst)
        columns.append(timing)

    scale, unit = next((s, u) for s, u in scales if worst >= s)
    rows.append(
        [f"{label:>{width}}:", *(f" {c / scale:.3f} {unit} " for c in columns)]
    )

colwidth = max(len(c) for r in rows for c in r[1:])
print(' ' * (width + 1), *(p.center(colwidth) for p in placement), sep="  ")
for r, row in enumerate(rows):
    for c, p in enumerate(placement, 1):
        if bestrow[p][1] == r:
            row[c] = f"[{row[c][1:-1]}]"
        elif worstrow[p][1] == r:
            row[c] = f"<{row[c][1:-1]}>"
    print(*row, sep="  ")

percentages = []
for p in placement:
    best, worst = bestrow[p][0], worstrow[p][0]
    ratio = ((worst - best) / worst)
    percentages.append(f"{ratio:{colwidth - 1}.1%} ")

print("% best vs worst:".rjust(width + 1), *percentages, sep="  ")

দুর্দান্ত উত্তর! বিশেষত যেহেতু আপনি আসল কারণটি সরবরাহ করেন এটি আরও ভাল: পি
জোড়ান ব্যাসলি

18

আপনি যদি রেজেক্সের সাহায্যে এটি করতে চান, আপনি কেবল "দুনিয়া" শব্দটি পেতে একটি নন-ক্যাপচারিং গোষ্ঠী ব্যবহার করতে পারেন এবং তারপরে সমস্ত কিছু ধরে ফেলুন, এর মতো

(?:world).*

উদাহরণ স্ট্রিং এখানে পরীক্ষা করা হয়


28
কিছু লোক সমস্যার মুখোমুখি হলে "আমি জানি, আমি একটি নিয়মিত অভিব্যক্তি ব্যবহার করি" think ... এখন আপনার 2 টি সমস্যা আছে ...
জোড়ান বিসলে

2
হাহা, আমার ভুল, আমি ভেবেছিলাম এটি ট্যাগ হয়েছিল রেজেক্স তাই আমি একটি রেইজেক্স উত্তর দেওয়ার চেষ্টা করেছি। ওহ ভাল, এখন আছে।
তাডঘ

1
এটি সমস্ত ভাল ... এটি অবশ্যই এই বিড়ালের চামড়ার এক উপায় ... এই সমস্যার জন্য ওভারকিল যদিও (imho)
জোড়ান বিসলে

নন-ক্যাপচারিং গ্রুপ লিঙ্কটি আর সঠিক জিনিসটির দিকে নির্দেশ করছে না।
Apteryx

1
আগ্রহীদের জন্য। এখানে পূর্ণ কোডটি দেওয়া হয়েছেresult = re.search(r"(?:world)(.*)", "hello python world , i'm a beginner ").group(1)
RaduS

5

আপনি এই প্যাকেজটি "সাবস্ট্রিং" নামে ব্যবহার করতে পারেন। কেবল "পাইপ ইনস্টল সাবস্ট্রিং" টাইপ করুন। আপনি কেবল শুরু এবং শেষের অক্ষর / সূচকগুলি উল্লেখ করে সাবস্ট্রিংটি পেতে পারেন।

উদাহরণ স্বরূপ:

import substring

s = substring.substringByChar("abcdefghijklmnop", startChar="d", endChar="n")

print(s)

আউটপুট:

s = Defghijklmn


3

এটি একটি পুরানো প্রশ্ন তবে আমি খুব একই দৃশ্যের মুখোমুখি হয়েছি, আমার জন্য "স্ট্রিম" শব্দটি ডেমিমিলিটার হিসাবে ব্যবহার করে একটি স্ট্রিং বিভক্ত করা দরকার আমার সমস্যা হ'ল আমার একই স্ট্রিংয়ে নীচের এবং নীচের শব্দটি ছিল string

আমি পুনরায় মডিউলটি এভাবে ব্যবহার করে সমাধান করেছি

import re

string = '...below...as higher prices mean lower demand to be expected. Generally, a high reading is seen as negative (or bearish), while a low reading is seen as positive (or bullish) for the Korean Won.'

নির্ভুল শব্দের সাথে মেলে রেগেক্সের সাথে পুনরায় স্প্লিট ব্যবহার করুন

stringafterword = re.split('\\blow\\b',string)[-1]
print(stringafterword)
' reading is seen as positive (or bullish) for the Korean Won.'

জেনেরিক কোডটি হ'ল:

re.split('\\bTHE_WORD_YOU_WANT\\b',string)[-1]

আশা করি এটি কারও সাহায্য করতে পারে!


1
সম্ভবত আপনার কাছে শুধু ব্যবহার করতে পারে: string.partition(" low ")[2]? (উভয় পাশের স্পেসগুলি নোট করুনlow
এমটিএল দেব

1

এই সাধারণ পদ্ধতির চেষ্টা করুন:

import re
my_string="hello python world , i'm a beginner "
p = re.compile("world(.*)")
print (p.findall(my_string))

#[" , i'm a beginner "]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.