Python에서 string.contains
또는 string.indexof
메서드를 찾고 있습니다.
나하고 싶어:
if not somestring.contains("blah"): continue
질문자 :Blankman
Python에서 string.contains
또는 string.indexof
메서드를 찾고 있습니다.
나하고 싶어:
if not somestring.contains("blah"): continue
in
연산자를 사용할 수 있습니다.
if "blah" not in somestring: continue
하위 문자열 검색인 경우 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
평가됩니다. 이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다.
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
비교 연산자 때문에
>>> 'foo' in '**foo**' True
원래 질문이 요청한 반대 (보어)는 다음 not in
같습니다.
>>> 'foo' not in '**foo**' # returns False False
not 'foo' in '**foo**'
것과 의미상 동일하지만 훨씬 더 읽기 쉽고 가독성 향상을 위해 언어에서 명시적으로 제공됩니다.
__contains__
"포함" 메서드는 in
대한 동작을 구현합니다. 이 예는,
str.__contains__('**foo**', 'foo')
True
반환합니다. 슈퍼스트링 인스턴스에서 이 함수를 호출할 수도 있습니다.
'**foo**'.__contains__('foo')
하지만 하지마. 밑줄로 시작하는 메서드는 의미상 비공개로 간주됩니다. 구현하거나 연장 때 사용하는 유일한 이유는 in
및 not 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
find
및 index
을 사용하지 마십시오.다음 문자열 메서드를 사용하여 "포함"을 테스트하지 마세요.
>>> '**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 가상 머신에서 호출되어야 함을 알 수 있습니다. 이것은 차이점을 적절하게 설명해야 합니다.
if needle in haystack:
@Michael이 말했듯이 일반적인 사용입니다. in
연산자에 의존하므로 메서드 호출보다 읽기 쉽고 빠릅니다.
연산자 대신 메소드가 정말로 필요한 경우(예: key=
하기 위해...?), 그것은 'haystack'.__contains__
입니다. 그러나 귀하의 예는 if
에서 사용하기 위한 것이므로 실제로 귀하가 말하는 내용을 의미하지 않는 것 같습니다;-). 특수 메서드를 직접 사용하는 것은 좋은 형식(읽기 가능하지도 효율적이지도 않음)이 아닙니다. 대신 해당 메서드에 위임하는 연산자와 내장 함수를 통해 사용하기 위한 것입니다.
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
메소드는 문자열뿐만 아니라 반복 가능 항목에 대해 작동합니다.
"blah" in somestring
만족하지만 함수/메서드 호출을 원하면 아마도 이렇게 할 수 있습니다.
import operator if not operator.contains(somestring, "blah"): continue
파이썬의 모든 연산자는 더 많거나 적은에서 찾을 수 있습니다 오퍼레이터 모듈 을 포함 in
.
따라서 분명히 벡터 방식 비교와 유사한 것은 없습니다. 그렇게 하는 명백한 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
y.count()
사용할 수 있습니다.
하위 문자열이 문자열에 나타나는 횟수의 정수 값을 반환합니다.
예를 들어:
string.count("bah") >> 0 string.count("Hello") >> 1
귀하의 답변은 다음과 같습니다.
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
정규식을 사용하여 발생을 얻을 수 있습니다.
>>> import re >>> print(re.findall(r'( |t)', to_search_in)) # searches for t or space ['t', ' ', 't', ' ', ' ']
출처 : 여기를 클릭하세요
출처 : http:www.stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method
git rebase 실행 취소 (0) | 2021.10.01 |
---|---|
Java에서 메모리 누수를 어떻게 만들 수 있습니까? (0) | 2021.10.01 |
부동 소수점 수학이 깨졌습니까? (0) | 2021.10.01 |
Java의 특정 범위 내에서 임의의 정수를 어떻게 생성합니까? (0) | 2021.10.01 |
jQuery 배경이 있는 경우 "AngularJS에서 생각하기"가 필요합니까? [닫은] (0) | 2021.10.01 |