파이썬3 정규표현식 질문입니다.


소문자 2개에 둘러싸인, 대문자 하나를 추출하고 싶습니다.

예를들어, 'abCdeFgh'가 있으면 'C', 'F'를 뽑아내고 싶습니다.

import re

strings = "adIceLgnOqdVoiEibPvbYswTqjHcjOlpNxc"
m = re.findall('[a-z]{2}([A-Z])[a-z]{2}', strings)

print(m)

이렇게 코드를 짜보았는데 결과가

['I', 'O', 'E', 'Y', 'H', 'N'] 이렇게 나옵니다. 제대로 안나오네요.

정규표현식을 어떻게 짜야 제대로 나올까요?

답변 부탁드립니다. (_ _ )

  • 2018년 01월 05일에 작성됨

조회수 74


Banner bitmango

2 답변


{2}~~~{2} 부분을 1로 바꾸면 되지않을가요? 2칸이 띄어서 나오는거같네요 어차피 소문자 사이에 대문자가있던, 대문자만 추려내면 나오면 결과는 같은게 아닐까요??

import re
strings = "adIceLgnOqdVoiEibPvbYswTqjHcjOlpNxc"
m = re.findall('[A-Z]', strings)
print(m)

  • 답변 감사드려요. 하지만, 'xABCxxIxxABCxxLxxOxxVxxExxPxxYxxTxxHxxOxxNxx' 이렇게 되면 원하는 결과가 나오지 않습니다. 대문자만 뽑아버리니까요. '소문자 2개에 둘러싸인 대문자' 만 찾고 싶은 겁니다.    Radia   2018.1.8 22:19     

이 경우엔 정규식만으론 추출이 불가능합니다.

정규식을 findall 하면서 offset이 증가되버리니 겹치는 구간은 매칭이 불가능합니다.

아래 코드는 간단히 짜본 코드입니다. 충분히 비교 횟수를 더 줄일 수 있는 방법이 보이지만, 참고 정도로 하시면 될 것 같습니다.

import re

strings = "adIceLgnOqdVoiEibPvbYswTqjHcjOlpNxc"

for i in range(0, len(strings)):
    m_str = strings[i:i+5]
    if (bool(re.match('[a-z]{2}([A-Z])[a-z]{2}', m_str)) == True):
        print(m_str)

실행 결과

adIce ceLgn gnOqd qdVoi oiEib ibPvb vbYsw swTqj qjHcj cjOlp lpNxc


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close