পাইথনের স্ট্রিংটিতে 'স্ট্রিং' রয়েছে?


3599

আমি পাইথনে একটি string.containsবা string.indexofপদ্ধতি খুঁজছি ।

আমি করতে চাই:

if not somestring.contains("blah"):
   continue

উত্তর:


6256

আপনি inঅপারেটরটি ব্যবহার করতে পারেন :

if "blah" not in somestring: 
    continue

228
ফণা অধীন, পাইথন ব্যবহার করবে __contains__(self, item), __iter__(self)আর __getitem__(self, key)যাতে নির্ধারণ একটি প্রদত্ত এ একটি আইটেম মিথ্যা রয়েছে কিনা হবে। inআপনার কাস্টম প্রকারের জন্য উপলভ্য করতে কমপক্ষে সেগুলির একটির প্রয়োগ করুন ।
বলপয়েন্টবেন

27
কেবল নিশ্চিত হয়ে নিন যে সামারস্ট্রিং কোনওটিই হবে না। অন্যথায় আপনি একটি পাবেনTypeError: argument of type 'NoneType' is not iterable
বড় কুমড়ো

5
এফডব্লিউআইডাব্লিউ, এই লক্ষ্যটি অর্জনের জন্য এটি বুদ্ধিমানের উপায়।
ট্রেনটন

6
স্ট্রিংগুলির জন্য, পাইথন inঅপারেটর কি রবিন-কার্প অ্যালগরিদম ব্যবহার করে?
স্যাম চ্যাটস

3
@SamChats দেখতে stackoverflow.com/questions/18139660/... বাস্তবায়ন বিস্তারিত জানার জন্য (CPython মধ্যে; আমি যতদূর জানি ভাষা স্পেসিফিকেশন এখানে কোন বিশেষ অ্যালগরিদম জনাদেশ না)।
ক্রিস্টোফ বার্সকা

667

যদি এটি কেবল একটি সাবস্ট্রিং অনুসন্ধান হয় তবে আপনি ব্যবহার করতে পারেন string.find("substring")

আপনার সাথে একটি সামান্য সতর্কতা অবলম্বন করা আবশ্যক আছে find, indexএবং in, যদিও তারা অনুসন্ধানসমূহ সাবস্ট্রিং করছে। অন্য কথায়, এটি:

s = "This be a string"
if s.find("is") == -1:
    print("No 'is' here!")
else:
    print("Found 'is' in the string.")

এটি Found 'is' in the string.একইভাবে মুদ্রণ if "is" in s:করবে, মূল্যায়ন করবে True। এটি আপনি যা চান তা হতে পারে বা নাও পারে।


78
সাবস্ট্রিং অনুসন্ধানগুলিতে জড়িত গেটছগুলি হাইলাইট করার জন্য +1। সুস্পষ্ট সমাধান হ'ল if ' is ' in s:যা Falseপ্রত্যাশিত হিসাবে ফিরে আসবে।
অ্যারোনস্টার্লিং

94
@ অ্যারোনাস্টার্লিং স্পষ্টত এটি হতে পারে তবে পুরোপুরি সঠিক নয়। আপনার যদি বিরামচিহ্ন থাকে বা এটি শুরু বা শেষ হয়? মূলধন কী? \bis\b( কেস সীমানা) সন্ধানের ক্ষেত্রে সংবেদনশীল রেজেক্স অনুসন্ধান করা ভাল ।
বব

2
@ জামিবুল আবার একবার, আপনি যদি শব্দের জন্য সীমানা হিসাবে বিরামচিহ্ন অন্তর্ভুক্ত করতে চান তবে আপনাকে অবশ্যই বিবেচনা করতে হবে। বিভাজন চেক এর সরল সমাধান হিসেবে মূলত একই প্রভাব ফেলবে ' is ', বিশেষত, এটা ধরা হবে না This is, a comma'বা 'It is.'
বব

7
@ জ্যামিবুল: আমি সন্দেহ করি যে কোনও সত্যিকারের ইনপুট বিভক্ত হয়ে s.split(string.punctuation + string.whitespace)গেলে তা একবারেও বিভক্ত হবে; ফাংশনগুলির / / পরিবারের splitমতো নয় , এটি কেবল তখন বিভক্ত হয় যখন এটি সমস্ত ক্রমান্বয়ে অক্ষরকে যথাযথভাবে দেখতে পায়। আপনি যদি চরিত্রের ক্লাসগুলিতে বিভক্ত করতে চান তবে আপনি নিয়মিত অভিব্যক্তিগুলিতে ফিরে এসেছেন (যে বিন্দুতে বিচ্ছেদ ছাড়াই অনুসন্ধান করা সহজ এবং দ্রুতগতিতে চলে যাওয়া)। striprstriplstripr'\bis\b'
শ্যাডোর্যাঞ্জার

8
'is' not in (w.lower() for w in s.translate(string.maketrans(' ' * len(string.punctuation + string.whitespace), string.punctuation + string.whitespace)).split()- ঠিক আছে, পয়েন্ট নেওয়া হয়েছে। এটি এখন হাস্যকর ...
জেমি বুল

190

পাইথনের স্ট্রিংটিতে কি স্ট্রিং পদ্ধতি রয়েছে?

হ্যাঁ, তবে পাইথনের একটি তুলনামূলক অপারেটর রয়েছে যা আপনার পরিবর্তে ব্যবহার করা উচিত, কারণ ভাষাটি এর ব্যবহারের পরিকল্পনা করে এবং অন্যান্য প্রোগ্রামাররা আপনাকে এটি ব্যবহার করার প্রত্যাশা করবে। সেই কীওয়ার্ডটি in, যা তুলনা অপারেটর হিসাবে ব্যবহৃত হয়:

>>> 'foo' in '**foo**'
True

বিপরীত (পরিপূরক), যা মূল প্রশ্নটি জিজ্ঞাসা করে তা হ'ল not in:

>>> 'foo' not in '**foo**' # returns False
False

এটি শব্দার্থগতভাবে একই not 'foo' in '**foo**'তবে এটি অনেক বেশি পঠনযোগ্য এবং স্পষ্টভাবে ভাষায় পাঠযোগ্যতার উন্নতি হিসাবে সরবরাহ করা হয়েছে।

ব্যবহার করবেন না __contains__, findএবংindex

প্রতিশ্রুতি হিসাবে, এখানে containsপদ্ধতি:

str.__contains__('**foo**', 'foo')

আয় True। আপনি এই ফাংশনটিকে সুপারস্টারনের উদাহরণ থেকে কল করতে পারেন:

'**foo**'.__contains__('foo')

কিন্তু না। আন্ডারস্কোর দিয়ে শুরু হওয়া পদ্ধতিগুলি শব্দার্থগতভাবে ব্যক্তিগত হিসাবে বিবেচিত হয়। এটি ব্যবহারের একমাত্র কারণ হ'ল inএবং not inকার্যকারিতা প্রসারিত করা (উদাহরণস্বরূপ যদি সাবক্লাসিং হয় str):

class NoisyString(str):
    def __contains__(self, other):
        print('testing if "{0}" in "{1}"'.format(other, self))
        return super(NoisyString, self).__contains__(other)

ns = NoisyString('a string with a substring inside')

এবং এখন:

>>> 'substring' in ns
testing if "substring" in "a string with a substring inside"
True

এছাড়াও, নিম্নলিখিত স্ট্রিং পদ্ধতিগুলি এড়িয়ে চলুন:

>>> '**foo**'.index('foo')
2
>>> '**foo**'.find('foo')
2

>>> '**oo**'.find('foo')
-1
>>> '**oo**'.index('foo')

Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    '**oo**'.index('foo')
ValueError: substring not found

অন্য ভাষাগুলিতে সরাসরি সাবস্ট্রিংগুলির জন্য সরাসরি পরীক্ষা করার কোনও পদ্ধতি নেই এবং তাই আপনাকে এই ধরণের পদ্ধতি ব্যবহার করতে হবে তবে পাইথনের সাথে inতুলনা অপারেটরটি ব্যবহার করা আরও কার্যকর is

পারফরম্যান্স তুলনা

আমরা একই লক্ষ্য অর্জনের বিভিন্ন উপায়ের তুলনা করতে পারি।

import timeit

def in_(s, other):
    return other in s

def contains(s, other):
    return s.__contains__(other)

def find(s, other):
    return s.find(other) != -1

def index(s, other):
    try:
        s.index(other)
    except ValueError:
        return False
    else:
        return True



perf_dict = {
'in:True': min(timeit.repeat(lambda: in_('superstring', 'str'))),
'in:False': min(timeit.repeat(lambda: in_('superstring', 'not'))),
'__contains__:True': min(timeit.repeat(lambda: contains('superstring', 'str'))),
'__contains__:False': min(timeit.repeat(lambda: contains('superstring', 'not'))),
'find:True': min(timeit.repeat(lambda: find('superstring', 'str'))),
'find:False': min(timeit.repeat(lambda: find('superstring', 'not'))),
'index:True': min(timeit.repeat(lambda: index('superstring', 'str'))),
'index:False': min(timeit.repeat(lambda: index('superstring', 'not'))),
}

এবং এখন আমরা দেখতে পাচ্ছি যে inব্যবহারগুলি অন্যদের তুলনায় অনেক দ্রুত। সমমানের অপারেশন করার জন্য কম সময় দেওয়া ভাল:

>>> perf_dict
{'in:True': 0.16450627865128808,
 'in:False': 0.1609668098178645,
 '__contains__:True': 0.24355481654697542,
 '__contains__:False': 0.24382793854783813,
 'find:True': 0.3067379407923454,
 'find:False': 0.29860888058124146,
 'index:True': 0.29647137792585454,
 'index:False': 0.5502287584545229}

6
কেন একজন এড়ানো উচিত str.indexএবং str.find? আপনি অন্য কাউকে কীভাবে কোনও স্ট্রিংয়ের সূচকটি সন্ধান করার পরিবর্তে এটির উপস্থিতি নেই বা না থাকার পরামর্শ দেবেন? (বা এর অর্থ s.find(ss) != -1ss in s
এইগুলির

3
ঠিক তাই, যদিও এই পদ্ধতিগুলির ব্যবহারের পিছনে অভিপ্রায়টি reমডিউলটির মার্জিত ব্যবহারের মাধ্যমে আরও ভালভাবে চিহ্নিত করা যেতে পারে । আমি এখনও লিখেছি এমন কোনও কোডে নিজেকে str.index বা str.find এর ব্যবহার খুঁজে পাইনি।
অ্যারন হল

str.countপাশাপাশি আপনার ব্যবহারের বিরুদ্ধে পরামর্শের উত্তরটি প্রসারিত করুন string.count(something) != 0ভয়ে কাঁপে
cs95

operatorমডিউল সংস্করণটি কীভাবে সম্পাদন করে?
jpmc26

@ jpmc26 এটি in_উপরের মতোই - তবে এটির চারপাশে স্ট্যাকফ্রেম রয়েছে, তাই এটি তার চেয়ে ধীর গতিতে: github.com/python/cpython/blob/3.7/Lib/operator.py#L153
অ্যারন হল

175

if needle in haystack:সাধারণ ব্যবহার যেমন @ মিশেল বলেছেন - এটি inঅপারেটরের উপর নির্ভর করে , একটি পদ্ধতির কলের চেয়ে আরও পঠনযোগ্য এবং দ্রুত।

আপনার যদি সত্যই অপারেটরের পরিবর্তে কোনও পদ্ধতির প্রয়োজন হয় (উদাহরণস্বরূপ key=খুব অদ্ভুত সাজানোর জন্য কিছু অদ্ভুত কিছু করা ...?), এটি হবে 'haystack'.__contains__। তবে যেহেতু আপনার উদাহরণটি ব্যবহারের জন্য if, তাই আমি অনুমান করি যে আপনি যা বলছেন তা সত্যই আপনি বোঝাতে চাইছেন না ;-)। সরাসরি বিশেষ পদ্ধতি ব্যবহার করা ভাল ফর্ম (না পাঠযোগ্য, না দক্ষ) নয় - সেগুলি অপারেটর এবং বিল্টিনগুলির মাধ্যমে তাদেরকে অর্পণ করা হয় used


55

in পাইথনের স্ট্রিং এবং তালিকা

inপদ্ধতি সম্পর্কে নিজেদের জন্য কথা বলার জন্য এখানে কয়েকটি দরকারী উদাহরণ দেওয়া হল :

"foo" in "foobar"
True

"foo" in "Foobar"
False

"foo" in "Foobar".lower()
True

"foo".capitalize() in "Foobar"
True

"foo" in ["bar", "foo", "foobar"]
True

"foo" in ["fo", "o", "foobar"]
False

["foo" in a for a in ["fo", "o", "foobar"]]
[False, False, True]

সতর্কীকরণ। তালিকাগুলি পুনরাবৃত্ত হয় এবং inপদ্ধতিটি কেবল স্ট্রিংগুলিতে নয়, পুনরাবৃত্তকারীগুলিতে কাজ করে।


1
একক স্ট্রিংয়ে তালিকার কোনওটির জন্য অনুসন্ধানযোগ্য পুনরাবৃত্তিযোগ্য তালিকাটি কি আবার পরিবর্তন করা যাবে? উদা: ["bar", "foo", "foobar"] in "foof"?
ক্যাফিনেটেড কোডার

1
@ ক্যাফিনেটেড কোডার, না, এর জন্য নেস্টেড পুনরাবৃত্তি প্রয়োজন। শ্রেষ্ঠ পাইপ দিয়ে তালিকা যোগদান করে কাজ "|" .join ([ "বার", "foo বিন্যাস", "FOOBAR"]) এবং এটি একটি Regex সংকলন, তারপর "foof" এ মিলে
firelynx

2
যেকোন (["বার", "ফু", "ফুবার"] এর জন্য x এর জন্য "ফুফ")
আইজাক ওয়েইস

1
@ আইজাকউইস আপনার এক লাইনার কাজ করে তবে এটি খুব পঠনযোগ্য নয় এবং এটি নেস্টেড পুনরাবৃত্তি করে। আমি এটি করার বিরুদ্ধে পরামর্শ দেব
অগ্নিনির্বাপ

1
@ পীযূষ.ওয়ানরে জটিলতার অর্থ কী? "ডাব্লুটিএফ / মিনিট" রেগেক্সের সাথে অনেক বেশি।
অগ্নিনির্বাপক

42

আপনি যদি খুশি হন "blah" in somestringতবে এটি কোনও ফাংশন / পদ্ধতি কল হতে চান, আপনি সম্ভবত এটি করতে পারেন

import operator

if not operator.contains(somestring, "blah"):
    continue

পাইথনের সমস্ত অপারেটর কম-বেশি অপারেটর মডিউল সহ পাওয়া যেতে পারে in


40

সুতরাং স্পষ্টতই ভেক্টর-ভিত্তিক তুলনার জন্য তেমন কিছু নেই for এটি করার একটি সুস্পষ্ট পাইথন উপায় হ'ল:

names = ['bob', 'john', 'mike']
any(st in 'bob and john' for st in names) 
>> True

any(st in 'mary and jane' for st in names) 
>> False

1
এটি কারণ পারমাণবিক ভেরিয়েবলগুলি থেকে একটি পণ্য তৈরির এক হাজার কোটি উপায় রয়েছে। আপনি এগুলিকে একটি টিপল, একটি তালিকায় (যা কার্টেসিয়ান পণ্যগুলির ফর্ম এবং একটি অন্তর্নিহিত ক্রমের সাথে আসে) স্টাফ করতে পারেন, বা তাদের কোনও শ্রেণীর বৈশিষ্ট্য (কোনও পূর্ব অর্ডার নয়) বা অভিধান মান হিসাবে নামকরণ করা যেতে পারে, বা এগুলিতে ফাইল হতে পারে একটি ডিরেক্টরি, বা যাই হোক না কেন। যখনই আপনি কোনও 'ধারক' বা 'প্রসঙ্গের' মধ্যে অনন্যভাবে (ইটার বা গেটাইটেম) সনাক্ত করতে পারেন, আপনি সেই 'ধারককে' একটি সেক্টর ভেক্টর হিসাবে দেখতে পাবেন এবং এতে বাইনারি অপ্স সংজ্ঞায়িত করতে পারেন। en.wikipedia.org/wiki/...
Niriel

inতালিকার সাথে ব্যবহার করা উচিত নয় এমন কিছুই নয় কারণ এটি উপাদানগুলির একটি রৈখিক স্ক্যান করে এবং তুলনায় ধীর হয়। পরিবর্তে একটি সেট ব্যবহার করুন, বিশেষত যদি সদস্যপদ পরীক্ষা বারবার করা হয়।
সিএস 95

22

আপনি ব্যবহার করতে পারেন y.count()

এটি কোনও স্ট্রিংয়ের মধ্যে একটি উপ স্ট্রিং প্রদর্শিত হওয়ার সংখ্যার পূর্ণসংখ্যার মানটি প্রদান করবে।

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

string.count("bah") >> 0
string.count("Hello") >> 1

7
একটি স্ট্রিং গণনা ব্যয়বহুল যখন আপনি কেবল এটি সেখানে আছে কিনা তা পরীক্ষা করতে চান ...
জিন-ফ্রান্সোয়েস ফ্যাব্রে

3
মূল পোস্টে ২০১০ সাল থেকে বিদ্যমান পদ্ধতিগুলি তাই সম্প্রদায়ের sensকমত্যের সাথে আমি এগুলি সম্পাদনা শেষ করেছিলাম (মেটা পোস্ট মেটা.স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / 385063/… দেখুন )
জ্যান-

17
কোন। আমার বক্তব্যটি হ'ল 9 বছর আগে অন্যরা যেমন করেছিল ঠিক একই জিনিসটির উত্তর দিচ্ছেন কেন?
জিন-ফ্রান্সোইস ফ্যাব্রে

10
কারণ আমি সাইট নিয়ন্ত্রণের করছি ... আমি মেটা প্রশ্ন জিজ্ঞাসা করেছি meta.stackoverflow.com/questions/385063/...
জাঁ ফ্রাসোয়া Fabre

2
তারপরে যদি এটি সরিয়ে দেওয়ার অধিকার আপনার কাছে থাকে তবে এটি মুছে ফেলুন, অন্যথায় আপনার যা করতে হবে তা করুন এবং এগিয়ে যান। আইএমও এই উত্তরটিতে মান যুক্ত হয় যা ব্যবহারকারীদের আপ-ভোট দ্বারা প্রতিফলিত হয়।
ব্র্যান্ডন বেইলি

20

আপনার উত্তর এখানে:

if "insert_char_or_string_here" in "insert_string_to_search_here":
    #DOSTUFF

এটি মিথ্যা কিনা তা যাচাইয়ের জন্য:

if not "insert_char_or_string_here" in "insert_string_to_search_here":
    #DOSTUFF

বা:

if "insert_char_or_string_here" not in "insert_string_to_search_here":
    #DOSTUFF

8

ঘটনাগুলি পেতে আপনি নিয়মিত প্রকাশ করতে পারেন:

>>> import re
>>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space
['t', ' ', 't', ' ', ' ']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.