it-swarm.asia

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

أنا أبحث عن طريقة string.contains أو string.indexof في Python.

أريد أن أفعل:

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

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

if "blah" not in somestring: 
    continue
5404
Michael Mrozek

إذا كان مجرد بحث فرعي يمكنك استخدام 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. هذا قد يكون أو لا يكون ما تريد.

556
eldarerathis

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

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

153
Alex Martelli

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

الطريقة 1: in operator

يمكنك استخدام مشغل Python in للتحقق من وجود سلسلة فرعية. انها بسيطة جدا وبديهية. سيعود 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

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

147
Rahul Gupta

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

نعم ، ولكن لدى Python مشغل مقارنة يجب استخدامه بدلاً من ذلك ، لأن اللغة تنوي استخدامه ، ويتوقع المبرمجون الآخرون استخدامه. هذه الكلمة الرئيسية هي 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

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

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

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

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}
130
Aaron Hall

لا ، ليست هناك طريقة string.contains(str) ، ولكن هناك عامل التشغيل in:

if substring in someString:
    print "It's there!!!"

فيما يلي مثال عملي أكثر تعقيدًا:

# Print all files with dot in home directory
import commands
(st, output) = commands.getstatusoutput('ls -a ~')
print [f for f in output.split('\n') if '.' in f ]
71
Bohdan

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

مذكرة قانونية. القوائم هي عناصر قابلة للتكرار ، ويعمل أسلوب in على مواد قابلة للتكرار ، وليس مجرد سلاسل.

43
firelynx

لذلك يبدو أنه لا يوجد شيء مماثل للمقارنة بين مكافحة ناقلات الأمراض. طريقة بايثون الواضحة للقيام بذلك هي:

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
32
Ufos

هناك طريقة أخرى للعثور على ما إذا كانت السلسلة تحتوي على عدد قليل من الأحرف أم لا مع قيمة الإرجاع المنطقية (أي 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
23
Harish Reddy

هناك أربعة أبسط الطرق لمعرفة ما هي السلسلة الفرعية وأين تبدأ السلسلة الفرعية.

الأول هو عن طريق المشغلinالمشغل:

someString = "Polly is drinking Coca-Cola."

"Coca-Cola" in someString
# Result: True

"Pepsi" in someString
# Result: False

الطريقة الثانية هي استخدام السلسلةfind()الطريقة.

بخلافinالمشغل الذي يتم تقييمه إلى منطقية قيمة ، فإنfindترجع عدد صحيح . هذا العدد الصحيح هو فهرس بداية سلسلة فرعية في حالة وجود هذه السلسلة الفرعية ، وإلا -1 يتم إرجاعها. وإليك كيف يعمل:

someString = "Polly is drinking Coca-Cola."

someString.find("is")
# Result: 6

someString.find("Pepsi")
# Result: -1

someString.find("Polly")
# Result: 0

يمكنك أيضًا تحديد مؤشرات البداية والنهاية للحد من بحثك. على سبيل المثال:

someString = "Polly is drinking Coca-Cola."

someString.find("is", 5, 10)
# Result: 6

someString.find("Polly", 15, 20)
# Result: -1

الثالث. وبالطبع ، يمكنك استخدامif...is notstatement (يعمل في Python 2.7 و 3.6):

someString = "Polly is drinking Coca-Cola."
substring = "drinking"

if someString.find(substring) is not -1:
    print("Cool! Python found the desired substring!")
else:
    print("Python didn't find the desired substring!")

# Result: "Cool! Python found the desired substring!"

أربعة. استخدمindex()الطريقة. انها تقريبا نفس طريقة find().

someString = "Polly is drinking Coca-Cola."
x = someString.index("drinking")
print(x)

# Result: 9

أتمنى أن يساعدك هذا.

18
ARGeo

أرى أن هناك إجابات بالفعل ، لكنني أريد إضافة سنتي أيضًا.

توجد في Python وظائف للقيام بذلك ، ولكن الطريقة الأكثر بسيطة (والأكثر تفضيلاً) هي استخدام الكلمة الأساسية 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.

17
Fipsi

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

import operator

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

يمكن العثور على جميع العوامل في Python بشكل أو بآخر في وحدة المشغل بما في ذلك in.

17
Jeffrey04

يمكنك استخدام بعض الطرق:

  1. if x in y:
  2. y.count()
  3. y.find()

1 تعبير منطقي ، وهذا يعني أنه سيعود إما حالة True of False تعتمد على حالة استيفاء الشرط أم لا.

منها مثلا:

string = "Hello world"

if "Hello" in string: >>True
if "Python" in string: >>False

2 سيعود القيمة الصحيحة لعدد مرات ظهور سلسلة فرعية في سلسلة.

منها مثلا:

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

3 سيعود قيمة المؤشر للموضع الأولي للسلاسل الفرعية المحددة. سيعود هذا أيضًا -1 إذا تعذر العثور على سلسلة فرعية.

منها مثلا:

string.find("Hello")  >>0
string.find("foo")  >>-1
15
Brandon Bailey

في Python هناك طريقتان بسيطتان يمكنك تحقيقهما:

الطريقة Pythonic: استخدام Python's 'في' Keyword-

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

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

انتاج:

True

الطريقة غير Pythonic: استخدام str.find لـ Python:

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

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

انتاج:

Substring found!
14
Inconnu

إليك إجابتك:

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
14
ytpillai

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

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
13
Jamie Bull

كما ذكر سابقًا ، يمكنك استخدام عامل التشغيل in مثل هذا:

>>> to_search_in = "String to search in"
>>> to_search = "search"
>>> print(to_search in to_search_in)
True
>>> print(to_search_in.find(to_search))
10

كما يمكنك استخدام التعبيرات العادية للحصول على الأحداث:

>>> import re
>>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space
['t', ' ', 't', ' ', ' ']
2
Muskovets

هناك العديد من الإجابات.

لكن استخدام count يمكن أن يكون مفيدًا أيضًا.

مثال:

strblah = 'I have blah in me'
if strblah.count('blah') > 0:
    print('Yes: substring found')
0
Naidu