파이썬 정규식 관련 질문입니다..
글쓴이: zkdnsxjaos / 작성시간: 수, 2012/11/21 - 2:13오후
메타 문자 /b 와 /B에 대해서 뭔가 만지작거리다가 이상한점을 발견했습니다..
/b 의 경우는 단어의 시작과 끝을 지정하니..
re.findall(r'\bhi\b', 'rony, hi !') 의 경우 당연히 hi를 찾겠죠
그리고 /B의 경우는 re.findall(r'\Bhi\B', 'strange hi voice') 에서 hi를 찾고, re.findall(r'/Bhi/B', ' hi voice')에서는 아무것도 못찾겠죵
근데 이상한게
re.findall(r'\b-\b', 'already-ordered used-item.') 에서의 두개의 - 는 \b에 해당하는 위치가 없으니 아무것도 찾지 않아야 하는데 'already-ordered used-item.' 에서의 두개의 -를 찾구요..
re.findall(r'\B-\B', 'already-ordered used-item') 의 경우는 안찾습니다.
찾는것이 \w에 해당하는 (ex. hi) 것들은 \b가 의미대로 쓰이는데, \W인 것들에 대해서는 이상하게 동작을 하네요. 마치 '\b-\b'가 아닌 '-' 처럼요!!(긔요미 표정이 아닙니다..^^;;)
뭔가 이상하지 않습니까?
왜그런거죠.?
Forums:
\b는 단어의 시작과 끝이 아니라, \w와 \W의
\b는 단어의 시작과 끝이 아니라, \w와 \W의 boundary를 의미합니다.
(단어의 시작과 끝 포함)
already-ordered 의 경우 y가 \w, - 가 \W 이고, o가 \w이므로
\b-\b 조건에 맞습니다.
답변감사합니다. 한가지만 더 물어볼께요
\b 는 \w와 \W의 경계라 하셨는데 이말이 잘 이해가 안되네요..
물론 \B는 \W와 \w의 경계이겠는데..
두 메타문자사이의 경계라니.. 뭐 set의 개념을 적용해야하는건가요? 그렇다면 \w에 속하는 [0-9a-zA-Z] 와 [^0-9a-zA-Z]의 사이엔 공백문자밖에 남지 않는데 그런뜻인가요?
http://docs.python.org/2/library/re.html
http://docs.python.org/2/library/re.html
\b는 \w와 \W 사이의 empty string으로, zero-width match입니다. ^가 스트링 시작의 zero-width match이고 $가 스트링 끝의 zero-width match이듯요.
\w는 C locale 기준 [a-zA-Z0-9_]입니다.
\W는 C locale 기준 [^a-zA-Z0-9_]입니다.
y-o에서 y랑 o는 전자, -는 후자입니다.
\b가 \w와 \W 사이라고 한다면, [a-zA-Z0-9_][^a-zA-Z0-9_] 또는 [^a-zA-Z0-9_][a-zA-Z0-9_] 요렇게 변화가 일어나는 곳이겠죠.
그러면 y랑 -의 사이는 \b가 맞겠네요. 전자랑 후자가 만났으니까요.
-랑 o의 사이도 \b가 맞겠네요. 후자랑 전자가 만났으니까요.
다른분이 답변주셨지만..경계는 boundary라는
다른분이 답변주셨지만..
경계는 boundary라는 의미이고,
\W와 \w가 만나는 지점, ( 또는 순서를 바꿔서 \w와 \W가 만나는 지점) 입니다.
set개념, 공백문자는 관계없는 이야기이고요..
\B는 \W와 \w의 경계가 아니라.. (이것도 \b죠..)
\w와 \w 사이, \W와 \W 사이를 의미합니다..
\w의 의미는 로케일에 따라 달라질 수 있습니다.
--
쉽게 생각해서 원래 생각하신대로 단어의 시작과 끝이 맞습니다.
다만 단어의 기준이 \w라는 거죠. 즉 [a-zA-Z0-9_] 의 연속이 1개의 단어가 되는겁니다.
이 기준으로 abc-def-efg!@#$defg!12_34 는 다섯단어(?)이고 8개의 경계가 있습니다.
감사합니다.
\B가 살짝 헷갈려서 저는 아무것도 안 적었었는데 적어주신 내용을 보니 이해가 잘 가네요. 감사합니다.
댓글 달기