나는

2014-01-08 2 views
3
test_string = '''dated as of October 17, 2012 when we went caroling, dated as of December 21, 2011 when we ate bananas''' 


import re 
import calendar 

months_full = '|'.join([month for month in calendar.month_name][1:]) 

pattern_1 = r'\b' + months_full + r'\s+\d{1,2},?\s+\d{4},?' 
test_pattern = re.compile(pattern_1) 
x = test_pattern.findall(test_string) 

print x 

>>> 
['October', 'December 21, 2011'] 
>>> 

가 내 정규식 단어 경계나는

어떤 달을 발견에서 시작

을 요구하고있다 생각 (철자 테스트 문자열에서 모든 날짜를 데리러이 REGEX을 수정하고

를 대문자로 어떻게

다음 1 또는 2 자리 뒤에 하나 이상의 공백

있을 필요

,363,210

가 다음

가 가

다음 4 자리

이 있어야 하나 이상의 공백

이어서 하나 또는 제로 콤마있을 및 마지막 자리에 바로 인접 쉼표 것이 끝날 수도

날짜를 얻으면 유효성을 검사 할 예정입니다. 따라서 케이스가 너무 걱정되지 않습니다.

1 월 1 일, 유효한 날짜가 맞는지 확인할 수있는 것처럼 2999 건입니다.

첫 번째 달을 12 월으로 바꿀 때 정규 표현식이 두 날짜를 반환한다는 것을 알았습니다. 나는 \ b와 함께 놀았습니다. 및 기타 유사하지만이 과거를 얻을 수 없습니다.

모든 관찰은 많은

을 이해할 수있을 것이다
+1

대체 요일 (월 이름 포함)을 캡처하지 않는 그룹'(? : ...)에 넣는 것을 잊었습니다.) ' –

+0

답변으로 제공 – PyNEwbie

+0

당신이 저에게 답을 주면 감사합니다. 받아 들일 수 있고 유용하다고 표시 할 수 있습니다. – PyNEwbie

답변

3

당신이 (?:...)

타 통지가 비 캡처 그룹의 월 이름과 교대를 넣어 잊어 버린 때문에 귀하의 패턴이 작동하지 않습니다

그것은이다 모듈을 적재하여 영어로 작성하는 수치스런 경우, 작성하여 패턴을 최적화 할 수 있습니다! 예 :

pattern_1 = r'\b(?:(?:jan|febr)uary|ma(?:y|rch)|ju(?:ne|ly)|a(?:pril|ugust)|(?:octo|(?:sept|nov|dec)em)ber)\s+[0-9]{1,2},?\s+[0-9]{4},?' 
+0

통찰력을위한 매끄러운 감사 – PyNEwbie

+0

나는 당신의 대답을 편집 하겠지만 나는 다른 평판이 필요하지 않다. ((? : octo | (: sept | nov | dec) em) ber)) 너 알지? ust 직후 | – PyNEwbie

+0

@PyNEwbie : 고마워, 나는 고쳤다 (나는 생각한다). –

1

매우 가까이 있습니다!

시도 :

import re 
import calendar 

test_string = '''dated as of October 17, 2012 when we went caroling, dated as of December 21, 2011 when we ate bananas''' 
test_pattern = re.compile('|'.join(r'(?:\b%s\s+\d{1,2},\s+\d{4})' % month 
             for month in calendar.month_name[1:])) 
print test_pattern.findall(test_string) 
# ['October 17, 2012', 'December 21, 2011'] 

기타 의견 :

정규식의 끝 부분에있는 옵션 ,?에 대한 필요가 없습니다
  1. . 그것은 정말로 정규식의 첫 번째 부분이 더 이상 날짜의 유효성을 검사하지 않습니다.
  2. 대/소문자를 구분하지 않으려면 re.I을 사용해야 할 수도 있습니다.
  3. 당신은 월, 일, 연도 캡처 December 21,\n2011
  4. 를 사용하여 이름을 캡처 그룹과 같은 합법적 인 날짜 캐리지 리턴으로 처리 re.S을 사용하고 날짜를 확인하기 위해 날짜를 사용해야 할 수도 있습니다.