'.'의 차이점 , '?' 정규식에서 '*'?


21

이 세 가지 요소 (이것은 메타 문자라고하는)가 어떻게 다른지에 대한 예를 얻을 수 있습니까?

나는 그것이 *전부 또는 아무것도 의미하지 않는다는 것을 알고 있지만, 그것이 그것을 생각하는 올바른 방법인지 확실하지 않습니다. 한편 .?같은 것 같다. 그들은 하나의 문자와 일치합니까?



답변:


16

Wikipedia 에서 직접 가져옴 :

? 물음표는 앞의 요소가 없거나 한 번 발생했음을 나타냅니다. 예를 들어, colou? r은 "color"및 "colour"와 모두 일치합니다.

*별표는 이전 요소가 0 회 이상 있음을 나타냅니다. 예를 들어 ab * c는 "ac", "abc", "abbc", "abbbc"등과 일치합니다.

큰 차이점은 별표는 0이상 발생하는 반면 물음표는 0 번 또는 1 번 일치 한다는 것 입니다. 이 두 가지 예를 비교하십시오.

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

colouur문자 u (한정자 앞의 이전 요소 ?)에서 두 번 이상 발생 했기 때문에 와 일치하지 않지만와 ?일치합니다.*

비슷한 예 :

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

같은 위키 백과 페이지에서 :

모든 단일 문자와 일치합니다 (많은 응용 프로그램은 개행을 제외하고 개행으로 간주되는 문자는 맛, 문자 인코딩 및 플랫폼에 따라 다르지만 줄 바꿈 문자가 포함되어 있다고 가정하는 것이 안전합니다). POSIX 대괄호 표현식 내에서 점 문자는 리터럴 점과 일치합니다. 예를 들어, ac는 "abc"등과 일치하지만 [ac]는 "a", "."또는 "c"와만 일치합니다.

이 예에서는

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

적절하게, 마지막 것은 다음과 같이 읽습니다. match any line that has "colou", plus any character, plus letter "r"

결론

당신은 물었습니다 : " '*'는 전부 또는 아무것도 의미하지 않는다는 것을 알고 있습니다. 그러나 그것이 그것을 생각하는 올바른 방법인지 확실하지 않습니다. 다른 쪽 '.' & '?' 같은 것 같아요. " 보다시피, 점과 별표는 정확히 동일하지 않습니다. 점은 해당 특정 위치를 차지할 수있는 모든 문자에서 작동하며 물음표는 이전 요소에서 작동합니다.


32

정규 표현식쉘 글러브 와 혼동 할 수 있습니다.

정규 표현식에서 구문 .은 단일 문자 (보통 개행 문자 제외)를 나타내며, 앞의 정규식 원자 (문자 또는 그룹) 중 0 개 이상을 의미 *하는 수량 자입니다. ?는 선행 원자의 0 또는 1 개의 인스턴스를 의미하는 정량화 기 , 또는이를 지원하는 정규식 변형체 에서 정량화 거동을 욕심없는 것으로 설정 하는 수정 자 입니다.

쉘 globs에서 ?단일 문자 (regex와 같음 .)를 *나타내며 0 개 이상의 문자 시퀀스 (regex와 동일 함 )를 나타냅니다 .*.

도움이 될만한 참고 문헌은 http://www.regular-expressions.info/quickstart.htmlhttp://mywiki.wooledge.org/glob입니다.


6

참고 : Examples provided are in Python.비록 개념은 동일합니다.

'.'개행 문자를 제외한 모든 문자와 일치 하는 일치하는 기호 입니다 ( 파이썬에서 인수 로 재정의 할 수도 있음 ). 따라서 와일드 카드 라고도합니다 .re.DOTALL

'*'A는 정량 (요소가 발생할 수 있습니다 얼마나 자주 정의가). {0,}의 줄임말입니다 .

"0 이상 일치"를 의미 합니다. 별 앞에있는 그룹은 텍스트에서 여러 번 나타날 수 있습니다. 완전히 결석하거나 반복해서 반복 할 수 있습니다.

'?'또한 수량 자 입니다. {0,1}의 줄임말입니다 .

"이 물음표 앞에있는 그룹 중 하나 또는 하나와 일치"를 의미 합니다. 또한 물음표 앞 부분이 선택 사항 으로 해석 될 수도 있습니다 .

예 :

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

위의 예에서 '?' 앞에있는 두 자리 숫자는 선택 사항이므로 최대 한 번만 발생하거나 발생하지 않을 수 있습니다.

'.'의 차이점 그리고 '?':

'.'정규 표현식에서 보유하고있는 장소의 단일 문자 를 일치 / 수락 / 확인 합니다 .

예 :

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'앞에 오는 그룹 의 0 또는 단일 항목을 일치 / 확인합니다 .

휴대폰 번호 예를 확인하십시오.

동일합니다 '*'. 앞에 오는 그룹이 0 개 이상 있는지 확인 합니다 .

콤비네이션:

'.*': 가능한 많은 시퀀스를 허용합니다. 욕심 접근 .

'.*?'첫 번째 일치 시퀀스를 승인하고 중지합니다. 욕심없는 접근

자세한 내용은 다음 두 가지 질문을 읽으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.