문제

The의 차이점은 무엇입니까? search() 그리고 match() 의 기능 파이썬 re 기준 치수?

나는 그것을 읽었다 선적 서류 비치 (현재 문서), 그러나 나는 그것을 기억하지 못하는 것 같습니다. 나는 계속 그것을 찾아서 그것을 다시 배우는 것이 었습니다. 나는 누군가가 예를 들어 내 머리에 달라 붙을 수 있도록 사례로 명확하게 대답하기를 바라고 있습니다. 또는 적어도 내 질문으로 돌아올 더 좋은 곳을 가질 것이며 그것을 다시 배우는 데 시간이 덜 걸릴 것입니다.

도움이 되었습니까?

해결책

re.match 문자열의 시작 부분에 고정되어 있습니다. 그것은 Newlines와 아무 관련이 없으므로 사용하는 것과 동일하지 않습니다. ^ 패턴에서.

로서 Re. MATCH DOCUPINATION 말 :

0 이상의 문자 인 경우 문자열의 시작 정규 표현 패턴과 일치시키고 해당 대응을 반환하십시오 MatchObject 사례. 반품 None 문자열이 패턴과 일치하지 않는 경우; 이것은 제로 길이 일치와 다릅니다.

참고 : 문자열의 어느 곳에서나 경기를 찾으려면 사용하십시오. search()대신에.

re.search 전체 문자열을 검색합니다 문서가 말합니다:

문자열을 스캔하십시오 정규 표현 패턴이 일치하는 위치를 찾고, 해당 MatchObject 사례. 반품 None 문자열의 위치가 없으면 패턴과 일치합니다. 이것은 문자열의 어느 시점에서 제로 길이 일치를 찾는 것과 다릅니다.

따라서 문자열의 시작 부분에서 일치하거나 전체 문자열 사용과 일치 해야하는 경우 match. 더 빠릅니다. 그렇지 않으면 사용하십시오 search.

문서에는 a 특정 섹션 match vs. search 그것은 또한 멀티 라인 문자열을 다룹니다.

Python은 정규 표현식을 기반으로 두 가지 다른 원시 작업을 제공합니다. match 경기를 확인합니다 처음에만 문자열의 search 경기를 확인합니다 어딘가에 문자열에서 (이것은 기본적으로 Perl이하는 일입니다).

주목하십시오 match 다를 수 있습니다 search정규 표현을 시작할 때에도 '^': '^' 문자열의 시작 부분에서만 일치하거나 MULTILINE 새로운 라인 직후 모드. “match”작동이 성공합니다 패턴이 일치하는 경우에만 시작 문자열의모드에 관계없이 또는 선택 사항에 의해 주어진 시작 위치에 pos새로운 라인이 앞에 있는지 여부에 관계없이 인수.

이제 충분한 이야기. 몇 가지 예제 코드를 볼 시간 :

# example code:
string_with_newlines = """something
someotherthing"""

import re

print re.match('some', string_with_newlines) # matches
print re.match('someother', 
               string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, 
               re.MULTILINE) # also won't match
print re.search('someother', 
                string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, 
                re.MULTILINE) # also finds something

m = re.compile('thing$', re.MULTILINE)

print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines, 
               re.MULTILINE) # also matches

다른 팁

search ⇒ 문자열의 어느 곳에서나 무언가를 찾아 매치 객체를 반환하십시오.

match ⇒에서 무언가를 찾으십시오 시작 문자열의 일치 객체를 반환합니다.

re.search 검색패턴에 대한 ES 문자열 전체에, 반면 re.match 하다 검색하지 않습니다 패턴; 그렇지 않다면 성냥 문자열의 시작시.

아래 예제를 참조하여 Re.Match 및 Re.Search의 작동을 이해할 수 있습니다.

a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)

Re.Match는 아무것도 반환하지 않지만 Re.Search는 ABC를 반환합니다.

차이점은 re.match() 익숙한 사람을 오도합니다 , grep, 또는 sed 정규 표현식 일치 및 re.search() 하지 않습니다. :-)

더 냉정한 John D. Cook은 말합니다, re.match() "모든 패턴이 ^ Prepended처럼 행동합니다." 다시 말해, re.match('pattern') 동등합니다 re.search('^pattern'). 그래서 그것은 패턴의 왼쪽을 고정시킵니다. 그러나 그것은 또한 패턴의 오른쪽을 정박하지 않습니다. 여전히 종료가 필요합니다 $.

솔직히 위의 내용을 주었다고 생각합니다 re.match() 더 이상 사용되지 않아야합니다. 나는 그것이 유지되어야하는 이유를 알고 싶을 것입니다.

일치는 검색보다 훨씬 빠르므로 regex.search ( "Word")를 수행하는 대신 regex.match ((.*?) Word (.*?))를 수행하고 수백만 명의 성능을 얻을 수 있습니다. 샘플.

위의 수락 된 답변에서 @ivan_bilan 의이 의견 그런지 생각하게 해주세요 마구 자르기 실제로 속도를 높이고 있으므로 실제로 얼마나 많은 성능을 얻을 수 있는지 알아 보겠습니다.

다음 테스트 스위트를 준비했습니다.

import random
import re
import string
import time

LENGTH = 10
LIST_SIZE = 1000000

def generate_word():
    word = [random.choice(string.ascii_lowercase) for _ in range(LENGTH)]
    word = ''.join(word)
    return word

wordlist = [generate_word() for _ in range(LIST_SIZE)]

start = time.time()
[re.search('python', word) for word in wordlist]
print('search:', time.time() - start)

start = time.time()
[re.match('(.*?)python(.*?)', word) for word in wordlist]
print('match:', time.time() - start)

나는 10 가지 측정 (1m, 2m, ..., 10m 단어)을 만들었고 다음 플롯을 제공했습니다.

match vs. search regex speedtest line plot

결과 라인은 놀랍게도 (실제로 놀랍게도) 똑바로 있습니다. 그리고 search 함수는 (약간) 더 빠릅니다 이 특정 패턴 조합이 주어졌습니다. 이 시험의 도덕 : 코드를 과도하게 최적화하지 마십시오.

RE. 패턴과 일치하려는 시도 문자열의 시작 부분에서. RE. 검색은 패턴과 일치하려고 시도합니다 문자열 전체에 경기가 시작될 때까지.

훨씬 짧은 :

  • search 전체 문자열을 스캔합니다.

  • match 문자열의 시작 만 수행합니다.

다음은 다음과 같이 말합니다.

>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top