홈>
정규식을 동적으로 생성하는 응용 프로그램 코드가 있습니다 일부 구문 분석을 위해 구성에서. 두 변형의 성능을 타이밍 할 때 정규식 변형 OR 정규식의 각 부분을 캡처하면 정규 정규식. 그 이유는 정규식 모듈에서 내부적으로 특정 작업의 오버 헤드 때문입니다.
>>> import timeit
>>> setup = '''
... import re
... '''
#no capture group
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.922958850861
#with capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.44321084023
#no capture group
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.913202047348
# capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.41544604301
질문 :캡처 그룹을 사용할 때 성능이 크게 저하되는 원인은 무엇입니까?
- 답변 # 1
- 답변 # 2
이유는 매우 간단합니다. 캡처 그룹을 사용하면 콘텐츠를 메모리에 저장하는 엔진이 표시되고 캡처 그룹이 아닌 그룹을 사용하면 아무것도 저장하지 않는 엔진이 표시됩니다. 엔진에 더 많은 작업을 수행하도록 지시하고 있다고 가정하십시오.
예를 들어,이 정규식을 사용하면 또는
(hello|bye|ola|cheers)
원자 그룹 또는(hello)|(bye)|(ola)|(cheers)
와 같은 비 캡처 그룹을 사용하는 것보다 상당히 높은 영향을 미칩니다. .regex를 사용할 때 위와 같은 내용을 캡처할지 여부를 알고 있습니다. 이러한 단어를 캡처하려는 경우 성능이 저하되지만 콘텐츠를 캡처 할 필요가없는 경우 캡처하지 않은 그룹을 사용하는 것처럼 개선하여 성능을 절약 할 수 있습니다
파이썬에 태그를 달았지만 js 정규식 엔진에서 캡처 및 비 캡처 그룹이 미치는 영향을 보여주기 위해 자바 스크립트에 대한 온라인 벤치 마크를 준비했습니다.
https://jsperf.com/capturing-groups-vs-non-capturing-groups
(?:hello|bye|ola|cheers)
관련 자료
- java - 논리 OR 내에서 정규식 캡처 그룹
- dart - 패턴으로 시작하는 여러 그룹을 캡처하는 정규식
- python 3.x - 논리적 AND 내부 정규식 그룹에 대해 미리보기를 사용하는 여러 그룹의 정규식
- python - 특정 단어를 대체하기 위해 정규 표현식을 작성하려고합니다
- python - 한글 캡처를위한 RegEx
- 구조화 된 문자열의 일부를 캡처하기위한 RegEx
- xml - 여러 대상 검색을 일치시키는 RegEx
- PhpStorm의 검색 및 바꾸기 대화 상자를 사용하여 다음 텍스트를 변환하는 RegEx
- bash - Sed 반복 번호 그룹 캡처
- 정규식 여러 줄에서 3 줄 그룹을 얻는 방법
- javascript - 정규식에서 마지막 그룹을 캡처하지 않음
- python - 정규식 검색 실패
- python - 부분 단어를 검색하여 정규식으로 대체
- 첫 번째 검색에서 정규식을 종료하는 방법
- javascript - 정규식 - 정규식에서 동일한 값 검색
- linux - grep을 사용하여 정규식 일치 그룹을 새 문자열로 재결합
- 그룹을 일치시키고 새로운 캐릭터와 결합하여 CSV를 만드는 정규식
- 정규식을 사용하여 VS 코드 검색 및 바꾸기 (닫힌 패턴)
- python 3.x - 문자열 내에서 정규식 검색을 10 자리 숫자와 일치시킬 수 없습니다
- python - 정규식을 사용하여 일치하는 항목을 기준으로 일반 텍스트 파일을 한 줄씩 검색하고 체리 선택
관련 질문
- python : 부분 문자열의 시작과 끝의 정규식 추출
- (Python) 두 개의 동일한 숫자를 계산할 때 빈 출력을 얻고 Regex w/dict에서 키 이름을 변경할 수 없음
- python을 사용하여 PDF 파일 형식의 악성 PDF에서 데이터/주요 콘텐츠 추출
- python : Regex를 사용하여 여러 줄을 선택하는 방법
- python : 특정 단어로 시작하는 줄과 일치하는 정규식 패턴
- Python Regex: 왜 물음표(?)가 추가 공백과 일치합니까?
- python : 정규식은 'substr'에서 시작하지만 'substr'을 포함하지 않는 모든 문자열을 찾습니다.
- python : 공백으로 구분된 단어 그룹과 일치하는 정규식
- python : 일치하는 구문을 찾는 정규식 패턴
- 접두사 문자열 목록을 다른 문자열과 일치시키는 Python 정규식
귀하의 패턴은 캡처 그룹에서만 다릅니다. 정규식 패턴에서 캡처 그룹을 정의하고 패턴을
re.search
와 함께 사용하는 경우 결과는MatchObject
입니다. 예. 각 일치 오브젝트에는 비어있는 경우에도 패턴에 캡처 그룹이있는 수만큼그룹이 포함됩니다. 이것이re
의 오버 헤드입니다 내부 : 그룹 목록 (메모리 할당 등) 추가. 그룹에일치하는 텍스트의 시작 및 끝 색인등 세부 정보가 포함되어 있다는 점에 유의하십시오 (MatchObject
참조). 참조).