আমি কীভাবে আগে সমস্ত কিছু পেতাম: স্ট্রিং পাইথনে


107

আমি এর আগে একটি স্ট্রিংয়ের মধ্যে সমস্ত চিঠি পেতে একটি উপায় সন্ধান করছি: তবে কোথায় শুরু করব সে সম্পর্কে আমার কোনও ধারণা নেই। আমি কি রেজেক্স ব্যবহার করব? যদি তাই হয়, কিভাবে?

string = "Username: How are you today?"

আমি কী করতে পারি তার উপর কেউ আমাকে উদাহরণ দেখাতে পারে?

উত্তর:


181

শুধু splitফাংশন ব্যবহার করুন । এটি একটি তালিকা দেয়, যাতে আপনি প্রথম উপাদানটি রাখতে পারেন:

>>> s1.split(':')
['Username', ' How are you today?']
>>> s1.split(':')[0]
'Username'

12
হয় বিভাজন সীমাবদ্ধ করুন, বা এই ক্ষেত্রে - ব্যবহার করুনs1.partition(':')[0]
জন ক্লিমেটস

ধন্যবাদ এটি খুব দরকারী এবং তথ্যপূর্ণ ছিল। প্লাস এটি একটি বড় সাহায্য ধন্যবাদ!
0

4
বিভাজন ব্যবহার করবেন না, যেহেতু এটি সমস্ত ':' প্রক্রিয়াকরণ করে এবং একটি সম্পূর্ণ অ্যারে তৈরি করে, দীর্ঘতর স্ট্রিংয়ের জন্য ভাল নয়। একটি সূচক ব্যবহার করার জন্য @ হ্যাকাহলিকের দৃষ্টিভঙ্গি দেখুন। ঠিক সেইরূপে একজন একটি রেজেক্সেরও প্রস্তাব দিচ্ছে যা স্পষ্টভাবে কার্যকর নয়। এছাড়াও .substringBefore () যা সূচক ভিত্তিক মানক ক্রিয়াকলাপ করার জন্য একটি অজগর বিকল্প থাকতে হবে। এবং .substringBefireLast () ইত্যাদির মতো বিভিন্নতাও সুবিধার জন্য সেখানে থাকতে হবে (কোডটি পুনরাবৃত্তি করা উচিত নয়)। বিভাজন সম্পর্কে বিন্দুটি লক্ষ্য করেছেন - হ্যাঁ, ':' এর পরে কম প্রক্রিয়াজাতকরণ করা হয়েছে, তবে তারপরে '1' এর পরিবর্তে <ক্লাস 'টিপল'>: ('1', ':', '2: 3') ফিরে আসে।
আর্ট করুন

48

ব্যবহার index:

>>> string = "Username: How are you today?"
>>> string[:string.index(":")]
'Username'

সূচী আপনাকে অবস্থান দেবে : স্ট্রিংয়ে , তারপরে আপনি এটিকে টুকরো টুকরো করতে পারেন।

আপনি যদি রেজেক্স ব্যবহার করতে চান:

>>> import re
>>> re.match("(.*?):",string).group()
'Username'                       

match স্ট্রিংয়ের শুরু থেকে মিলছে।

আপনি ব্যবহার করতে পারেন itertools.takewhile

>>> import itertools
>>> "".join(itertools.takewhile(lambda x: x!=":", string))
'Username'

4
এই পদ্ধতিটি (স্ট্রিং [: string.index (":")]] সম্ভবত বিভাজনের চেয়ে পরিষ্কার
ড্যামিয়েন

গতির জন্য রেজেক্স ব্যবহার করবেন না - এখানে বর্ণিত প্রথম সূচক বিকল্পটি ব্যবহার করুন। Regex পরিষ্কারভাবে কার্যকর হিসাবে কার্যকর নয়। এছাড়াও .substringBefore () যা সূচক ভিত্তিক মানক ক্রিয়াকলাপ করার জন্য একটি অজগর বিকল্প থাকতে হবে। এবং .substringBeforeLast () ইত্যাদির মতো বিভিন্নতাও সুবিধার জন্য সেখানে থাকতে হবে (কোডটি পুনরাবৃত্তি করা উচিত নয়)। কেন সূচকটি আরও ভাল কাজ করে এবং তারপরে ফ্রেডট্যান্টিনির প্রতিক্রিয়াতে এখন কেন বেশি ভোট দেওয়া সহ অন্যান্য পদ্ধতির উপর কেন এটি ব্যবহার করা উচিত তা বোঝাতে এই উত্তরটি আপডেট করার পরামর্শ দিন।
9:30

এটি উপস্থিত না থাকলে সূচক ব্যর্থ হবে।
মার্চ

19

আপনি প্রয়োজন হবে না regexএই জন্য

>>> s = "Username: How are you today?"

অক্ষরটির splitস্ট্রিং বিভক্ত করতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন':'

>>> s.split(':')
['Username', ' How are you today?']

এবং [0]স্ট্রিংয়ের প্রথম অংশটি পেতে উপাদানটি কেটে নিন

>>> s.split(':')[0]
'Username'

9

আমি পাইথন ৩..0.০ (আইপিথন) এর অধীনে এই বিভিন্ন প্রযুক্তিগুলির বেঞ্চমার্ক করেছি।

টিএলডিআর

  • দ্রুততম (যখন বিভাজনের প্রতীকটি cজানা যায়): প্রাক-সংকলিত রেজেক্স।
  • দ্রুত (অন্যথায়): s.partition(c)[0]
  • নিরাপদ (যেমন, যখন c নাও থাকতে পারে s): বিভাজন, বিভক্ত।
  • অনিরাপদ: সূচক, রেজেক্স।

কোড

import string, random, re

SYMBOLS = string.ascii_uppercase + string.digits
SIZE = 100

def create_test_set(string_length):
    for _ in range(SIZE):
        random_string = ''.join(random.choices(SYMBOLS, k=string_length))
        yield (random.choice(random_string), random_string)

for string_length in (2**4, 2**8, 2**16, 2**32):
    print("\nString length:", string_length)
    print("  regex (compiled):", end=" ")
    test_set_for_regex = ((re.compile("(.*?)" + c).match, s) for (c, s) in test_set)
    %timeit [re_match(s).group() for (re_match, s) in test_set_for_regex]
    test_set = list(create_test_set(16))
    print("  partition:       ", end=" ")
    %timeit [s.partition(c)[0] for (c, s) in test_set]
    print("  index:           ", end=" ")
    %timeit [s[:s.index(c)] for (c, s) in test_set]
    print("  split (limited): ", end=" ")
    %timeit [s.split(c, 1)[0] for (c, s) in test_set]
    print("  split:           ", end=" ")
    %timeit [s.split(c)[0] for (c, s) in test_set]
    print("  regex:           ", end=" ")
    %timeit [re.match("(.*?)" + c, s).group() for (c, s) in test_set]

ফলাফল

String length: 16
  regex (compiled): 156 ns ± 4.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
  partition:        19.3 µs ± 430 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  index:            26.1 µs ± 341 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split (limited):  26.8 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split:            26.3 µs ± 835 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  regex:            128 µs ± 4.02 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

String length: 256
  regex (compiled): 167 ns ± 2.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
  partition:        20.9 µs ± 694 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  index:            28.6 µs ± 2.73 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split (limited):  27.4 µs ± 979 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split:            31.5 µs ± 4.86 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  regex:            148 µs ± 7.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

String length: 65536
  regex (compiled): 173 ns ± 3.95 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
  partition:        20.9 µs ± 613 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  index:            27.7 µs ± 515 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split (limited):  27.2 µs ± 796 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split:            26.5 µs ± 377 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  regex:            128 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

String length: 4294967296
  regex (compiled): 165 ns ± 1.2 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
  partition:        19.9 µs ± 144 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
  index:            27.7 µs ± 571 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split (limited):  26.1 µs ± 472 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  split:            28.1 µs ± 1.69 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  regex:            137 µs ± 6.53 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

4
কেন আপনি বিবেচনা না সূচক অনিরাপদ?
জেমস

4
s.index(c)যখন cনেই তখন একটি মান উত্থাপন করে s। সুতরাং, আমি এটিকে নিরাপদ হিসাবে বিবেচনা করি যখন আমি নিশ্চিত যে পার্টিশনযুক্ত স্ট্রিংটিতে বিভাজক রয়েছে, অন্যথায় অনিরাপদ।
এরিস্টেড

4
সূচকের জন্য, গ এর মধ্যে রয়েছে, তাই এটি অনিরাপদ এবং এখনও দ্রুত নয়।
আর্টিং

3

বিভাজন () আরও ভাল হয়ে যেতে পারে তবে এই উদ্দেশ্যে বিভক্ত হয়ে যাবে (কারণ) আপনার কোনও সীমানা ছাড়াই বা আরও সীমানাবিহীন পরিস্থিতিগুলির জন্য এটির পূর্বাভাসযোগ্য ফলাফল রয়েছে has


4
উভয় partitionএবং splitএকটি খালি স্ট্রিং বা কোনও ডিলিমিটারগুলির সাথে স্বচ্ছতার সাথে কাজ করবে। এটি word[:word.index(':')]উভয় ক্ষেত্রেই পপ হবে তা লক্ষণীয় ।
রব হল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.