이 세 가지 요소 (이것은 메타 문자라고하는)가 어떻게 다른지에 대한 예를 얻을 수 있습니까?
나는 그것이 *
전부 또는 아무것도 의미하지 않는다는 것을 알고 있지만, 그것이 그것을 생각하는 올바른 방법인지 확실하지 않습니다. 한편 .
와 ?
같은 것 같다. 그들은 하나의 문자와 일치합니까?
이 세 가지 요소 (이것은 메타 문자라고하는)가 어떻게 다른지에 대한 예를 얻을 수 있습니까?
나는 그것이 *
전부 또는 아무것도 의미하지 않는다는 것을 알고 있지만, 그것이 그것을 생각하는 올바른 방법인지 확실하지 않습니다. 한편 .
와 ?
같은 것 같다. 그들은 하나의 문자와 일치합니까?
답변:
? 물음표는 앞의 요소가 없거나 한 번 발생했음을 나타냅니다. 예를 들어, 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"
결론
당신은 물었습니다 : " '*'는 전부 또는 아무것도 의미하지 않는다는 것을 알고 있습니다. 그러나 그것이 그것을 생각하는 올바른 방법인지 확실하지 않습니다. 다른 쪽 '.' & '?' 같은 것 같아요. " 보다시피, 점과 별표는 정확히 동일하지 않습니다. 점은 해당 특정 위치를 차지할 수있는 모든 문자에서 작동하며 물음표는 이전 요소에서 작동합니다.
정규 표현식 을 쉘 글러브 와 혼동 할 수 있습니다.
정규 표현식에서 구문 .
은 단일 문자 (보통 개행 문자 제외)를 나타내며, 앞의 정규식 원자 (문자 또는 그룹) 중 0 개 이상을 의미 *
하는 수량 자입니다. ?
는 선행 원자의 0 또는 1 개의 인스턴스를 의미하는 정량화 기 , 또는이를 지원하는 정규식 변형체 에서 정량화 거동을 욕심없는 것으로 설정 하는 수정 자 입니다.
쉘 globs에서 ?
단일 문자 (regex와 같음 .
)를 *
나타내며 0 개 이상의 문자 시퀀스 (regex와 동일 함 )를 나타냅니다 .*
.
도움이 될만한 참고 문헌은 http://www.regular-expressions.info/quickstart.html 및 http://mywiki.wooledge.org/glob입니다.
참고 : 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 개 이상 있는지 확인 합니다 .
콤비네이션:
'.*'
: 가능한 많은 시퀀스를 허용합니다. 욕심 접근 .
'.*?
'첫 번째 일치 시퀀스를 승인하고 중지합니다. 욕심없는 접근
자세한 내용은 다음 두 가지 질문을 읽으십시오.