python - هل لدى بايثون طريقة سلسلة "تحتوي على" سلسلة فرعية؟




string substring contains (13)

هل يحتوي Python على سلسلة تحتوي على طريقة فرعية؟

نعم ، لكن لدى Python مشغل مقارنة يجب استخدامه بدلاً من ذلك ، لأن اللغة تقصد استخدامه ، ويتوقع منك المبرمجون الآخرون استخدامه. هذه الكلمة الرئيسية موجودة ، والتي يتم استخدامها كمشغل للمقارنة:

>>> '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')

لكن لا تفعل تعتبر الطرق التي تبدأ بشرط سفلية شرطية خاصة. السبب الوحيد لاستخدام هذا هو عند توسيع الوظيفة not in الوظيفة (على سبيل المثال ، إذا كانت الفئة الفرعية subclassing 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

قد لا تحتوي اللغات الأخرى على طرق للاختبار المباشر للخطوط الفرعية ، ولذلك سيكون عليك استخدام هذه الأنواع من الأساليب ، ولكن باستخدام Python ، يكون استخدام معالج المقارنة أكثر فاعلية.

مقارنات الأداء

يمكننا مقارنة طرق مختلفة لتحقيق الهدف نفسه.

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'))),
}

والآن نرى أن استخدامه هو أسرع بكثير من الآخرين. أقل وقت للقيام بعملية مكافئة أفضل:

>>> 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}

أنا أبحث عن string.contains أو string.indexof في بايثون.

اريد ان افعل:

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

أرى أن هناك إجابات بالفعل ولكن أريد أن أضيف سنتي كذلك.

توجد في بيثون وظائف للقيام بذلك ، لكن الطريقة الأكثر بساطة (والأكثر تفضيلاً) هي استخدام الكلمة الأساسية in :

"test" in "testtext"
True

"abc" in "abcdefg"
True

"abc" in "Abc"
False

"ABC" in "abc"
False

"abc" in "def"
False

"abc" in ["abc", "def", "ghi"]
True

هناك بعض طرق السلسلة كذلك:

"xxabcxx".find("abc")
2 #returns the index of the first match

"xxabcxx".find("cde")
-1 #returns -1 if the substring 
#could not be found in the string

# and:

"xxabcxx".index("abc")
2

"xxabcxx".index("cde")
ValueError: substring not found
#raises ValueError...

حول الأداء:

بشكل عام in طريقة صام للعثور على سلسلة فرعية ...

find أسرع قليلا من index

آمل أن أتمكن من مساعدة!


if needle in haystack: هو الاستخدام العادي ، كما يقولMichael - فإنه يعتمد على المشغل ، وأكثر قابلية للقراءة وأسرع من استدعاء الأسلوب.

إذا كنت حقا بحاجة إلى طريقة بدلا من المشغل (على سبيل المثال للقيام ببعض key= غريب key= لفرز غريب جدا ...؟) ، من شأنه أن يكون 'haystack'.__contains__ . ولكن منذ المثال الخاص بك هو للاستخدام في ، if كنت لا تعني حقا ما تقوله ؛-). ليس من الشكل الجيد (ولا يمكن قراءته ، ولا يتسم بالكفاءة) استخدام أساليب خاصة مباشرة - بل يتم استخدامها بدلاً من ذلك من خلال المشغلين والمبتكرين الذين يفوضونهم.


طريقة أخرى لمعرفة ما إذا كانت سلسلة تحتوي على بضعة أحرف أم لا مع قيمة إرجاع Boolean (أي True أو `False):

str1 = "This be a string"
find_this = "tr"
if find_this in str1:
    print find_this, " is been found in ", str1
else:
    print find_this, " is not found in ", str1

أساسا ، كنت ترغب في العثور على سلسلة فرعية في سلسلة في بيثون. هناك طريقتان للبحث عن سلسلة فرعية في سلسلة في Python.

الطريقة 1: in المشغل

يمكنك استخدام مشغل Python للتحقق من وجود سلسلة فرعية. انها بسيطة جدا وبديهية. سيقوم بإرجاع True إذا تم العثور على السلسلة الفرعية في السلسلة آخر False .

>>> "King" in "King's landing"
True

>>> "Jon Snow" in "King's landing"
False

الطريقة 2: أسلوب str.find()

الطريقة الثانية هي استخدام الأسلوب str.find() . هنا ، نسميه طريقة .find() على السلسلة التي توجد بها السلسلة الفرعية. نجتاز السلسلة الفرعية إلى طريقة find () ونتحقق من قيمة إرجاعها. إذا كانت قيمته غير -1 ، تم العثور على السلسلة الفرعية في السلسلة ، وإلا لا. القيمة التي تم إرجاعها هي فهرس حيث تم العثور على سلسلة فرعية.

>>> some_string = "valar morghulis"

>>> some_string.find("morghulis")
6

>>> some_string.find("dohaeris")
-1

أود أن أوصيكم باستخدام الطريقة الأولى لأنها أكثر بديهية وبديهية.


إذا كانت مجرد بحث عن سلسلة فرعية ، يمكنك استخدام string.find("substring") .

عليك أن تكون حذراً قليلاً في find ، index ، وعلى الرغم من أنها عمليات البحث الفرعية. بعبارة أخرى ، هذا:

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 . هذا قد يكون أو لا يكون ما تريده.


يوجد في بيثون طريقتان بسيطتان يمكنك تحقيقهما:

الطريقة البايثونية: استخدام كلمة "في" في بيثون

in يأخذ "جهازي" اثنين ، أحدهما على اليسار ( السلسلة الفرعية ) والآخر على اليمين ، ويعرض True إذا كانت الوسيطة اليمنى متضمنة في وسيطة الحقوق ، وإذا لم يكن الأمر كذلك ، فإنها تُرجع False .

example_string = "This is an example string"
substring = "example"
print(substring in example_string)

انتاج:

True

الطريقة غير البيثونية: استخدام str.find في Python:

ترجع طريقة find موضع السلسلة داخل السلسلة أو -1 إذا لم يتم العثور عليها. ولكن ببساطة تحقق ما إذا كان الموقف ليس -1.

if example_string.find(substring) != -1:
    print('Substring found!')
else:
    print('Substring not found!')

انتاج:

Substring found!

إذا كنت تبحث عن البحث غير الحساس لحالة الأحرف ككل ، بدلاً من سلسلة فرعية موجودة في كلمة أخرى:

import string

s = 'This is my text example'
if 'is' not in (word.lower() 
    for split_char in string.punctuation + string.whitespace 
    for word in s.split(split_char)):
    # do something

يمكنك استخدام المشغل :

if "blah" not in somestring: 
    continue

هنا إجابتك:

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

إذا كنت راضيًا عن كلمة "blah" in somestring ولكنك تريدها أن تكون عبارة عن مكالمة وظيفية ، فيمكنك القيام بذلك على الأرجح

import operator

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

يمكن العثور على جميع المشغلين في Python بشكل أو بآخر في وحدة المشغل بما 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

مذكرة قانونية. القوائم عبارة عن تكرارات ، والأسلوب يعمل على التكرار ، وليس فقط السلاسل.


أحد الأمثلة على ما يبدو مفقود هنا: نسخة كاملة (ضحلة).

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>> 

هذا هو تعبير شائع لإنشاء نسخة من أنواع التسلسل (وليس من السلاسل التي تحتفظ بها). [:] نسخ ضحل لقائمة ، انظر python-list-slice-used-for-no-obvious-reason .





python string substring contains