파이썬 정규식 관련 질문입니다..

zkdnsxjaos의 이미지

메타 문자 /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'가 아닌 '-' 처럼요!!(긔요미 표정이 아닙니다..^^;;)
뭔가 이상하지 않습니까?
왜그런거죠.?

qiiiiiiiip의 이미지

\b는 단어의 시작과 끝이 아니라, \w와 \W의 boundary를 의미합니다.
(단어의 시작과 끝 포함)

already-ordered 의 경우 y가 \w, - 가 \W 이고, o가 \w이므로
\b-\b 조건에 맞습니다.

zkdnsxjaos의 이미지

\b 는 \w와 \W의 경계라 하셨는데 이말이 잘 이해가 안되네요..
물론 \B는 \W와 \w의 경계이겠는데..

두 메타문자사이의 경계라니.. 뭐 set의 개념을 적용해야하는건가요? 그렇다면 \w에 속하는 [0-9a-zA-Z] 와 [^0-9a-zA-Z]의 사이엔 공백문자밖에 남지 않는데 그런뜻인가요?

Prentice의 이미지

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가 맞겠네요. 후자랑 전자가 만났으니까요.

qiiiiiiiip의 이미지

다른분이 답변주셨지만..
경계는 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개의 경계가 있습니다.

Prentice의 이미지

\B가 살짝 헷갈려서 저는 아무것도 안 적었었는데 적어주신 내용을 보니 이해가 잘 가네요. 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.