etc./StackOverFlow

Python에 문자열 '포함' 하위 문자열 메서드가 있습니까?

청렴결백한 만능 재주꾼 2021. 10. 1. 03:20
반응형

질문자 :Blankman


Python에서 string.contains 또는 string.indexof 메서드를 찾고 있습니다.

나하고 싶어:

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


in 연산자를 사용할 수 있습니다.

 if "blah" not in somestring: continue

Michael Mrozek

하위 문자열 검색인 경우 string.find("substring") 사용할 수 있습니다.

find , indexin 은 부분 문자열 검색이므로 약간 주의해야 합니다. 즉, 이것은:

 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 평가됩니다. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다.


eldarerathis

Python에 하위 문자열 메서드가 포함된 문자열이 있습니까?

사용 사례의 99% True 또는 False 를 반환하는 in 키워드를 사용하여 처리됩니다.

 'substring' in any_string

인덱스를 가져오는 사용 사례의 경우 str.find 사용합니다(실패 시 -1을 반환하고 선택적 위치 인수가 있음).

 start = 0 stop = len(any_string) any_string.find('substring', start, stop)

또는 str.index find 와 비슷하지만 실패 시 ValueError 발생):

 start = 100 end = 1000 any_string.index('substring', start, end)

설명

사용 in 비교 연산자 때문에

  1. 언어는 그 사용을 의도하고,
  2. 다른 파이썬 프로그래머는 당신이 그것을 사용하기를 기대합니다.
 >>> 'foo' in '**foo**' True

원래 질문이 요청한 반대 (보어)는 다음 not in 같습니다.

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

not 'foo' in '**foo**' 것과 의미상 동일하지만 훨씬 더 읽기 쉽고 가독성 향상을 위해 언어에서 명시적으로 제공됩니다.

__contains__ 사용을 피 __contains__

"포함" 메서드는 in 대한 동작을 구현합니다. 이 예는,

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

True 반환합니다. 슈퍼스트링 인스턴스에서 이 함수를 호출할 수도 있습니다.

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

하지만 하지마. 밑줄로 시작하는 메서드는 의미상 비공개로 간주됩니다. 구현하거나 연장 때 사용하는 유일한 이유는 innot in (예를 하위 클래스로 기능하는 경우 str ) :

 class NoisyString(str): def __contains__(self, other): print(f'testing if "{other}" in "{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

"포함"을 테스트하기 위해 findindex 을 사용하지 마십시오.

다음 문자열 메서드를 사용하여 "포함"을 테스트하지 마세요.

 >>> '**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 비교 연산자.

또한, 이러한 드롭에없는 교체를위한 in . -1 경우를 처리해야 할 수 있으며 0 을 반환하는 경우(처음에 부분 문자열을 찾았기 때문에) 부울 해석은 True 대신 False 입니다.

만약 당신이 정말로 not any_string.startswith(substring) 것을 의미한다면 그것을 말하십시오.

성능 비교

우리는 같은 목표를 달성하는 다양한 방법을 비교할 수 있습니다.

 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}

in__contains__ in 사용 __contains__ 어떻게 in이 __contains__보다 빠를 수 있습니까?

이것은 좋은 후속 질문입니다.

관심 있는 방법으로 함수를 분해해 보겠습니다.

 >>> from dis import dis >>> dis(lambda: 'a' in 'b') 1 0 LOAD_CONST 1 ('a') 2 LOAD_CONST 2 ('b') 4 COMPARE_OP 6 (in) 6 RETURN_VALUE >>> dis(lambda: 'b'.__contains__('a')) 1 0 LOAD_CONST 1 ('b') 2 LOAD_METHOD 0 (__contains__) 4 LOAD_CONST 2 ('a') 6 CALL_METHOD 1 8 RETURN_VALUE

그래서 우리는 .__contains__ 메소드가 별도로 조회된 다음 Python 가상 머신에서 호출되어야 함을 알 수 있습니다. 이것은 차이점을 적절하게 설명해야 합니다.


Aaron Hall

if needle in haystack: @Michael이 말했듯이 일반적인 사용입니다. in 연산자에 의존하므로 메서드 호출보다 읽기 쉽고 빠릅니다.

연산자 대신 메소드가 정말로 필요한 경우(예: key= 하기 위해...?), 그것은 'haystack'.__contains__ 입니다. 그러나 귀하의 예는 if 에서 사용하기 위한 것이므로 실제로 귀하가 말하는 내용을 의미하지 않는 것 같습니다;-). 특수 메서드를 직접 사용하는 것은 좋은 형식(읽기 가능하지도 효율적이지도 않음)이 아닙니다. 대신 해당 메서드에 위임하는 연산자와 내장 함수를 통해 사용하기 위한 것입니다.


Alex Martelli

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 메소드는 문자열뿐만 아니라 반복 가능 항목에 대해 작동합니다.


firelynx

"blah" in somestring 만족하지만 함수/메서드 호출을 원하면 아마도 이렇게 할 수 있습니다.

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

파이썬의 모든 연산자는 더 많거나 적은에서 찾을 수 있습니다 오퍼레이터 모듈 을 포함 in .


Jeffrey04

따라서 분명히 벡터 방식 비교와 유사한 것은 없습니다. 그렇게 하는 명백한 Python 방법은 다음과 같습니다.

 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

Ufos

y.count() 사용할 수 있습니다.

하위 문자열이 문자열에 나타나는 횟수의 정수 값을 반환합니다.

예를 들어:

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

Brandon Bailey

귀하의 답변은 다음과 같습니다.

 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

ytpillai

정규식을 사용하여 발생을 얻을 수 있습니다.

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

Muskovets

출처 : 여기를 클릭하세요


출처 : http:www.stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method

반응형