범위 판단하기 질문입니다.
, kang jisu님이 작성1. print(re.match('[b*]','a')) #b에는 a가 0개 이상 있나를 확인해 보았는데, 0개 이상 있다는 말은 없다라는 말도 되니까, 있다고 나와야하는데 None이라고 나오네요. 왜그러는건가요?
2. 밑의 상황에서는, a와 b 중 하나가 'a'에 0개 이상 포함되었을 때, None이 뜨지 않는건가요? 그런데 0개이상 포함되었다는 말은 포함되지 않았다는 말과 어떻게 다른지 이해가 잘 가지 않습니다.print(re.match('[a*b]','a'))
Re: 범위 판단하기 질문입니다.
, 도장_ 관리자님이 작성print(re.match('[b*]','a'))'[b*]'이라고 썼으면 범위로 지정한 것입니다. b라는 범위부터 시작하는 것이고, a는 범위에 포함되지 않습니다. 따라서 결과가 없습니다.
IDLE에서는 간단하게 re.match 대신에 re.findall을 이용해서 테스트해보면 쉽습니다.
>>> print(re.findall('[b*]', 'a'))
[]
알파벳 abcde...z의 순서이고, b 범위이므로 a는 해당 사항이 없습니다.
>>> print(re.findall('[b*]', 'b'))
['b']
b부터 시작하는 범위이고 'b'를 찾으니까 있습니다.
>>> print(re.findall('[b*]', 'bbbbbb'))
['b', 'b', 'b', 'b', 'b', 'b']
문제 없습니다.
문자열 비교에서는 [과 ] 같은 범위 지정을 쓰지 않습니다. 필요한 경우에만 쓰세요.
>>> print(re.findall('a*b', 'a'))
[]
>>> print(re.findall('a*b', 'ab'))
['ab']
>>> print(re.findall('a*b', 'b'))
['b']
>>> print(re.findall('a*b', 'aaaab'))
['aaaab']
>>>
[과 ]를 사용해서 범위로 지정해버리면
>>> print(re.findall('[a*b]', 'a'))
['a']
동작이 달라집니다.
>>> print(re.findall('a*b', 'a'))
[]
여기서는 a가 0개 이상입니다. b 또는 ab 또는 aab, a**************b처럼 a가 몇 개가 붙어도 패턴 일치가 됩니다.
여기서는 a가 0개 이상입니다. b 또는 ab 또는 aab, a**************b처럼 a가 몇 개가 붙어도 패턴 일치가 됩니다.
대신 'a'만 있으면 a*b에서는 b가 없기 때문에 패턴 일치 결과가 없습니다.
[a*b]는 [ab]와 같습니다.
>>> print(re.findall('[a*b]', 'a'))
['a']
['a']
>>> print(re.findall('[ab]', 'a'))
['a']
['a']
>>> print(re.findall('[a*b]', 'aaabbbb'))
['a', 'a', 'a', 'b', 'b', 'b', 'b']
>>> print(re.findall('[ab]', 'aaabbbb'))
['a', 'a', 'a', 'b', 'b', 'b', 'b']
>>> print(re.findall('[ab]', 'a'))
['a', 'a', 'a', 'b', 'b', 'b', 'b']
>>> print(re.findall('[ab]', 'aaabbbb'))
['a', 'a', 'a', 'b', 'b', 'b', 'b']
>>> print(re.findall('[ab]', 'a'))
[과 ]는 범위를 지정하는 데 쓰기 때문에 [a*b]나 [ab]나 같습니다. 범위이니까요. 잘못된 코딩 습관입니다.