'.'의 차이점 , '?' 그리고 정규 표현식에 '*'가 있나요?

'.'의 차이점 , '?' 그리고 정규 표현식에 '*'가 있나요?

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

그것이 전부 아니면 전무라는 뜻이라는 건 알지만 *, 그것이 올바른 생각인지는 잘 모르겠습니다. 반면에 .?같은 것 같습니다. 한 문자와 일치합니다. 그렇죠?

답변1

헷갈리실 수도 있어요정규 표현식~와 함께쉘 글로브

정규식 구문에서 단일 문자(일반적 으로 .개행 문자 제외)를 나타내며,*수량자0개 이상의 이전 정규식 원자(문자 또는 그룹)를 의미합니다. ?0 또는하나이전 원자의 인스턴스 또는 (이를 지원하는 정규식 변형에서)수정자이는 수량자 동작을 non-greedy로 설정합니다.

쉘 glob에서 는 ?단일 문자(regex의 와 같은 .)를 나타내고 은 *0개 이상의 문자 시퀀스(regex 와 동일 .*)를 나타냅니다.

도움이 될 수 있는 몇 가지 참고 자료는 다음과 같습니다.http://www.regular-expressions.info/quickstart.html그리고http://mywiki.wooledge.org/glob

답변2

에서 바로 가져옴위키피디아:

? 물음표는 이전 요소가 0개 또는 1개 발생함을 나타냅니다. 예를 들어, colou?r은 "color"와 "color" 모두와 일치합니다.

*별표는 이전 요소가 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"

결론

귀하는 다음과 같이 질문하셨습니다. "'*'가 전부 아니면 전무를 의미한다는 것은 알지만, 그것이 올바른 생각인지는 잘 모르겠습니다. 반면에 '.' & '?' 같은 것 같아." 보시다시피 점과 별표는 정확히 동일하지 않습니다. 점은 특정 위치를 차지할 수 있는 모든 문자에 적용되는 반면, 물음표는 이전 요소에 적용됩니다.

답변3

참고: Examples provided are in Python.개념은 동일하게 유지됩니다.

'.'일치하는 기호다음을 제외한 모든 문자와 일치합니다.개행 문자(이 역시 re.DOTALLPython의 인수로 재정의될 수 있습니다). 그러므로 그것은 또한 ~라고도 불린다.와일드카드.

'*'수량자(요소가 얼마나 자주 발생할 수 있는지 정의) 다음과 같이 짧습니다.{0,}.

그 뜻은"0개 이상 일치"—별 앞에 오는 그룹은 텍스트에서 여러 번 나타날 수 있습니다. 전혀 없을 수도 있고 계속해서 반복될 수도 있습니다.

'?'또한수량자. 다음과 같이 짧습니다.{0,1}.

그 뜻은"이 물음표 앞의 그룹 중 0개 또는 하나와 일치합니다."다음과 같이 해석되기도 합니다.물음표 앞의 부분은 선택 사항입니다..

예:

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개 이상의 그룹이 앞에 나타납니다..

콤비네이션:

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

'.*?' 첫 번째로 일치하는 시퀀스를 승인하고 중지합니다.탐욕스럽지 않은 접근 방식

자세한 내용을 보려면 다음 두 가지 질문을 읽어보세요.

관련 정보