파이썬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'] 이렇게 나옵니다. 제대로 안나오네요.

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

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

2답변

  • 좋아요

    1

    싫어요
    채택취소하기

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

    정규식을 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

    • 정규표현식만으로는 안 되는군요. 채택 늦어서 죄송해요ㅎㅎ. 답변 감사합니다! Radia 2018.2.28 13:25
  • {2}~~~{2} 부분을 1로 바꾸면 되지않을가요? 2칸이 띄어서 나오는거같네요 어차피 소문자 사이에 대문자가있던, 대문자만 추려내면 나오면 결과는 같은게 아닐까요??

    import re
    strings = "adIceLgnOqdVoiEibPvbYswTqjHcjOlpNxc"
    m = re.findall('[A-Z]', strings)
    print(m)
    
    • 답변 감사드려요. 하지만, 'xABCxxIxxABCxxLxxOxxVxxExxPxxYxxTxxHxxOxxNxx' 이렇게 되면 원하는 결과가 나오지 않습니다. 대문자만 뽑아버리니까요. '소문자 2개에 둘러싸인 대문자' 만 찾고 싶은 겁니다. Radia 2018.1.8 22:19

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.