답변:
re.match
문자열의 시작 부분에 고정됩니다. 그것은 개행과 관련이 없으므로 ^
패턴에서 사용하는 것과 동일하지 않습니다 .
현상태대로 re.match 설명서를 말한다 :
문자열 의 시작 부분에 0 개 이상의 문자가 정규식 패턴과 일치하면 해당
MatchObject
인스턴스를 리턴하십시오 .None
문자열이 패턴과 일치하지 않으면 반환 합니다. 이것은 길이가 0 인 일치와 다릅니다.참고 : 문자열의 어느 곳에서나 일치하는 항목을 찾으려면
search()
대신 사용하십시오.
re.search
설명서 에서 알 수 있듯이 전체 문자열을 검색합니다 .
문자열을 스캔하여 정규식 패턴이 일치하는 위치를 찾고 해당
MatchObject
인스턴스를 리턴하십시오 .None
문자열에서 패턴과 일치하는 위치가 없으면 반환 합니다. 이것은 문자열의 어느 시점에서 길이가 0 인 일치 항목을 찾는 것과 다릅니다.
따라서 문자열의 시작 부분에서 일치하거나 전체 문자열과 일치 해야하는 경우을 사용하십시오 match
. 더 빠릅니다. 그렇지 않으면를 사용하십시오 search
.
문서는이 특정 섹션 match
대search
또한 여러 문자열을 포함 :
파이썬은 정규 표현식을 기반으로 두 가지 다른 기본 연산을 제공 합니다. 문자열 의 시작 부분에서만
match
일치 를 확인 하고 문자열의 어느 곳에서나 일치 를 확인 합니다 (기본적으로 Perl이 수행하는 작업).search
참고
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
match
더 일반적인 것이 아니라 제한된 것을 사용 search
합니까? 속도입니까?
match
? 직관적이지 않은 이름으로 API를 파종하여 문서를 읽도록하는 것이 현명한 방법입니까? 나는 아직도 그것을하지 않을 것입니다! 반역자!
match
은 faster
동일한 정규 표현식을 사용할 때 검색보다 약간 보이지만 성능 테스트에 따라 예제가 잘못 보입니다 : stackoverflow.com/questions/180986/…
search
⇒ 문자열의 어느 곳에서나 무언가를 찾아서 일치하는 객체를 반환합니다.
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 단어)을 수행하여 다음 플롯을 얻었습니다.
결과 라인은 놀랍게도 (실제로는 그렇게 놀랍지 않습니다) 직선입니다. 그리고이 특정 패턴 조합이 주어지면 search
기능이 (약간) 빠릅니다 . 이 테스트의 교훈 : 코드를 과도하게 최적화하지 마십시오.
match
보다 함수가 여전히 빠릅니다 search
. 당신은 비교하여 스크립트에서 확인하실 수 있습니다 re.search('^python', word)
에re.match('python', word)
(또는 re.match('^python', word)
당신이 문서를 읽을 수없는 경우 이해하기가 동일하지만, 쉽게 및 성능에 영향을 미치지 않도록 보인다)
match
기능이 일반적으로 더 빠르다는 진술에 동의하지 않는다 . (가) match
검색 할 때 빠른 시작 부분에 문자열의의는 search
검색 할 때 빠른 걸쳐 문자열. 상식에 해당합니다. 그래서 @ivan_bilan이 잘못되었습니다. 그는 match
문자열 전체를 검색 하는 데 사용 했습니다. 그렇기 때문에 당신이 옳습니다-당신 match
은 문자열의 시작 부분에서 검색 하는 데 사용했습니다 . 당신이 저에게 동의하지 않는다면, match
그 정규식을 찾는 것이 더 빠르며 re.search('python', word)
같은 일 을 한다는 것을 찾으십시오 .
re.match('python')
이고 빠르게보다 근소 re.match('^python')
. 그건 그래야만 해.
match
. 문자열의 시작 부분에서 검색하려는 경우 함수가 약간 빠릅니다 (예 : search
함수를 사용하여 문자열의 시작 부분에서 단어를 찾는 것과 비교 re.search('^python', word)
). 그러나이 이상한 것을 발견했습니다 search
. 문자열의 시작 부분에서 검색 하도록 함수에 지시 하면 함수만큼 빠릅니다 match
.
차이점은 Perl , grep 또는 sed 정규 표현식 일치에 re.match()
익숙한 사람을 오도 하고 그렇지 않은 것입니다. re.search()
:-)
더 진지하게, 존 D. 쿡 발언 , re.match()
"모든 패턴이 ^ 앞에 추가 한 경우로 동작합니다." 다시 말해, re.match('pattern')
같습니다 re.search('^pattern')
. 따라서 패턴의 왼쪽을 고정합니다. 그러나 패턴의 오른쪽을 고정하지는 않습니다$
. 여전히 종료가 필요합니다 .
솔직히 위에서 말하면, 나는 re.match()
더 이상 사용되지 않아야 한다고 생각 합니다. 그것이 유지되어야하는 이유를 알고 싶습니다.