2013-02-05 5 views
0

각 대문자가 정확히 3 문자로 둘러싸인 소문자의 모든 인스턴스를 찾으려고합니다. 그런 다음이 패턴의 각 항목을 인쇄하려고합니다. 이것은 파이썬의 도전 과제입니다. 여기에 내가 무엇을 가지고 : 그것은 단지 "i" 인쇄정확히 3 개의 대문자로 묶인 소문자 일치

contents = "XXXiXXXjXXX" 
contents.scan(/[^A-Z]*[A-Z]{3}[a-z][A-Z]{3}[^A-Z]*/) { |i| print i[3] } 

, 그것은 "ij"를 인쇄해야 할 때. 내 정규식에 어떤 문제가 있습니까?

+0

당신은 블록이없는'scan'의 결과를 본 적이 있나요? 그것은'XXXiXXXj'입니다. 그래서'print i [3]'는 오직 하나의 문자만을 인쇄 할 것입니다. – halfelf

+0

그러면 반복적으로 패턴을 확인하고 각 문자를 추출하는 방법은 무엇입니까? – ordinary

+0

크게 재 작성하지 않으면 3 개의 대문자로 테스트 해 보았습니까? 정규 표현식은'F'와'O '사이의'[^ AZ] *'(즉, _Zero_ 어커런스)의 발생을'FOURxMORE'에서 일치시키고'R'과' E'. – Scott

답변

-1

일치하지 않는 이전/이후 기준을 삭제하면 정규식이 작동합니다. 몇 가지 잘못이있다

match = contents.match(/[A-Z]{3}([a-z])[A-Z]{3}/) 
match[1] if match 
+0

하나의 일치가 아닌 전체 텍스트를 통해 패턴을 확인하려면 어떻게해야합니까? – ordinary

+0

대문자가 3 자 이상 앞이나 뒤에 올 때이 값이 잘못 일치합니다. – sawa

0

, 그리고 무엇이 잘못되었는지를 설명하는 실용적이지 : 그럼 당신은이 같이 추출 할 값 주위 캡처 그룹으로 괄호를 추가해야합니다.

puts " #{contents} ".split(/[A-Z]{3}/).&(("a".."z").to_a).join 
0

2 일 :

단일 정규식 함께 할 필요가없는 경우, 여기에 간단한 방법입니다.

  • 귀하의 [^A-Z]* 아무것도에게 전체 경기 과거
  • 스캔 포인터의 발전이 'J'를 선택하지 이유입니다 처음으로하지 않습니다.

다소 복잡 lookaround 솔루션 :

re =/
    (?<=[A-Z]{3}) # 3 uppers behind 
    (?<![A-Z]{4}) # but not 4 
    [a-z] # one lower 
    (?=[A-Z]{3}) # 3 uppers ahead 
    (?![A-Z]{4}) # but not 4 
/x 

'XXXiXXXjXXX'.scan re 
#=> ["i", "j"] 
관련 문제