정규 표현식으로 문자열 검색하기

exsider의 이미지

'나다' 라는 문자열을 검색하는데 앞에 '가' 또는 '라' 가 붙어 있는 경우,
그리고 뒤에 '마' 가 붙어있는 경우는 제외하는 정규식을 만들려고 합니다.

예를 들어

나다
ab나다
aa나다파

등은 yes,

가나다아
라나다
나다마자

등은 no 를 리턴하게 하려고 합니다.

파이썬으로 다음 처럼 만들었는데

.*[^가라]나다[^마].*

이렇게 하면 '나다' 앞에 아무것도 없거나 뒤에 아무것도 없는 경우
no 가 나옵니다.

어떻게 수정해야 할까요???

pynoos의 이미지

한글은 보기에는 하나지만 내부적으로는 두 바이트입니다. 따라서
[^가] 이런 식의 접근은 잘못된 것입니다.

지금은 졸려서 자야겠네요 내일 생각합.... :)

익명 사용자의 이미지

pynoos wrote:
한글은 보기에는 하나지만 내부적으로는 두 바이트입니다. 따라서
[^가] 이런 식의 접근은 잘못된 것입니다.

지금은 2004년인데요. 마치 1994년인듯 한 착각을 하게 하시네요.

한글 한 음절이 '두 바이트라뇨?' 그것은 어떤 문자 집합을 어떤 인코딩에 따라 달라집니다. 파이썬은 유니코드를 잘 지원하는 것으로 알고 있습니다. 따라서, '[^가]'도 당연히 될 것입니다.

익명 사용자의 이미지

Anonymous wrote:
pynoos wrote:
한글은 보기에는 하나지만 내부적으로는 두 바이트입니다. 따라서
[^가] 이런 식의 접근은 잘못된 것입니다.

지금은 2004년인데요. 마치 1994년인듯 한 착각을 하게 하시네요.

한글 한 음절이 '두 바이트라뇨?' 그것은 어떤 문자 집합을 어떤 인코딩에 따라 달라집니다. 파이썬은 유니코드를 잘 지원하는 것으로 알고 있습니다. 따라서, '[^가]'도 당연히 될 것입니다.

두 바이트는 맞습니다.

잘 생각해 보십시오 -_-;

한글자로 취급 될 수 있는것이지 바이트 수로는 두 바이트가 분명 맞는 것 같습니다.

( 2 bytes 이상이 될수도 있겠지요 )

송효진의 이미지

이게 파이썬에서 될지는 모르겠는데 비슷하게 해보세요.
/(^|[^가라])나다([^마]|$)/u

한글 정규식을 사용하려면 UTF-8 이어야 할테고 대부분이 3 Bytes 입니다.

브라우저에서 js 로 하는거라면 UTF-16LE 이고 대부분이 2 Bytes 입니다.

pynoos의 이미지

Anonymous wrote:
pynoos wrote:
한글은 보기에는 하나지만 내부적으로는 두 바이트입니다. 따라서
[^가] 이런 식의 접근은 잘못된 것입니다.

지금은 2004년인데요. 마치 1994년인듯 한 착각을 하게 하시네요.

한글 한 음절이 '두 바이트라뇨?' 그것은 어떤 문자 집합을 어떤 인코딩에 따라 달라집니다. 파이썬은 유니코드를 잘 지원하는 것으로 알고 있습니다. 따라서, '[^가]'도 당연히 될 것입니다.

손님으로 쓰신 분이 처음 글을 올리신분인지 모르겠습니다만,
제 글의 한글이 두 바이트라고 쓴 가장 큰 이유는, 정규식의 [ ] 표현이
한글을 하나의 문자로 인식하느냐하지 않느냐에 있는 것입니다.

물론 한글은 인코딩 방식에 따라 2바이트이상이되는 것이 맞습니다.
제가 살고 있는 2004년에도 1994년과 달라진 것이 있다면, 유니코드가 표준화되었고,
그 당시에는 많았던 상당수 사용되지 않는 것을 제외한다면, 2 바이트인 완성형이 아직은 메인 캐릭터 코드임에는 틀림없고,
UTF8(저도 극히 바라는 바입니다만)이 메인이 되는 시대가 되려면 아직도 10년은 기다려야할 것 같습니다.

python에 대해서는 캐릭터 코드에 관한 흥미로운 프로젝트들이 많아서 좋습니다.
이 주제에 대해서는 perky님이 하실 말씀이 많을 것으로 보입니다.

잠시 시간을 내어 python 2.1.3의 소스를 봤는데, sre 라는 1.5.2 이후의 regular expression 코드 엔진에는 캐릭터 셋을 처리하기 위한 코드는 없어 보이는 군요.

아직까지는 "안녕" 안에 "홰"가 발견되는 문제를 해결하기에는 main python 코드에는 없고 third party 모듈을 사용해야할 것 같습니다.

http://kldp.net/projects/hre

요런 모듈등이 좋겠네요.

제가 테스트한 안녕과 홰에 관한 것은

>>> import re
>>> a = re.compile(".*(홰)")
>>> b = a.match("fjdklasbcd안녕dddjkl")
>>> b.group(0)
'fjdklasbcd\xbe\xc8\xb3'
>>> print b.group(0)
fjdklasbcd안?
>>>

입니다.

exsider의 이미지

송효진 wrote:
이게 파이썬에서 될지는 모르겠는데 비슷하게 해보세요.
/(^|[^가라])나다([^마]|$)/u

한글 정규식을 사용하려면 UTF-8 이어야 할테고 대부분이 3 Bytes 입니다.

브라우저에서 js 로 하는거라면 UTF-16LE 이고 대부분이 2 Bytes 입니다.

감사합니다.
위 코드를 약간 바꿔서
((.*[^가라])|^)나다(([^마].*)|$)
이렇게 하니 제가 원하는데로 동작하네요.

익명 사용자의 이미지

한글을 ㄱ 부터 힣 까지라는거는 한글을 뜻하고 '나다' 앞에 무조건 한글이 와야지만 처리하는것은
(?<=[ㄱ-힣])(나다)

반대로 한글이 오면 안되는 것을
(?

이렇게 처리하면 됩니다..

덧붙이자면 '나다'뒤에 무조건 한글이 와야하면
(나다)(?=[ㄱ-힣])

뒤에 한글이 오면 안되는거는
(나다)(?![ㄱ-힣])

그리고 정규표현식에서 .* 은 쓰지마세요

.* 은 모든것을 의미하기에 잘못사용하게 되면 속도에 큰 영향을 미치게 됩니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.