2013-03-04 3 views
1

나는이처럼 보이는 문자열에서 내용을 추출하려고 :부정 이전에 일치하는 단어 그룹

reg = re.compile(r''' 
    (?xi) 
    (\w\.\t*\s*)+ (?# e.g. A. or b.) 
    (.+)   (?# the alphanumeric content with common symbols) 
    ^(?:\1)  (?# e.g. 'not A.' or 'not b.') 
    ''') 

m = reg.findall(s) 

것은 내가 당신에게 줄 보자 : 여기

A.content content 
    content 
B.content C. content content 
content D.content 

을 그리고 파이썬에서 내 정규식 패턴입니다 예. 나는 다음과 같은 문자열을 말해봐 :

s = ''' 
a. $1000 abcde!? 
b. (December 31, 1993.) 
c. 8/1/2013 
d. $690 * 10% = 69 Blah blah 
''' 

나에게 정규식 그룹의 내용 반환 작동 다음 정규식 : 내용이 다른 라인에 이상 출혈하는 경우

reg = re.compile(r''' 
      (?xi) 
      \w\.\t* 
      ([^\n]+) (?# anything not newline char) 
''') 

for c in reg.findall(s): print "line:", c 
>>>line: $1000 abcde!? 
>>>line: (December 31, 1993.) 
>>>line: 8/1/2013 
>>>line: $690 * 10% = 69 Blah blah 

그러나을 , 정규식 은 작동하지 않습니다.

s = ''' 
    a. $1000 abcde!? B.  December 
    31, 1993 c. 8/1/2013 D. $690 * 10% = 
    69 Blah blah 
''' 
reg = re.compile(r''' 
    (?xi) 
    (\w\.\t*\s*)+ (?# e.g. A. or b.) 
    (.+)   (?# the alphanumeric content with common symbols) 
    ^(?:\1)  (?# e.g. 'not A.' or 'not b.') 
    ''') 
for c in reg.findall(s): print "line:", C# no matches :(
>>> blank :(

내용을 구분하는 개행 문자가 있는지 여부와 관계없이 동일한 일치 항목을 얻고 싶습니다.

그런 이유로 나는 부정적 일치 단어 그룹을 사용하여 시도했습니다. 그럼 내가 정규식이나 다른 해결 방법 중 하나를 통해이 문제를 해결할 수있는 방법에 대한 아이디어?

감사합니다.

바울은

+7

당신은 몇 가지 샘플을해야합니까 성냥/비 성냥? 당신이하려는 일을 알아내는 것은 약간 어렵습니다. – iamnotmaynard

+0

예제와 결과를 제공하도록 내 질문을 업데이트했습니다. – Paul

+0

이것은 여전히 ​​매우 신비한 일입니다. 당신이 얻고 싶었던 것과 일치하는 것을 게시하고 실제로 얻은 것과 다른 점은 무엇입니까? –

답변

1

나는 내가 당신이 원하는 것을 이해하고 생각 . 당신은

  • a. $1000 abcde!?
  • B. December \n31, 1993
  • c. 8/1/2013
  • D. $690 * 10% = \n69 Blah blah

오른쪽에

a. $1000 abcde!? B.  December 
31, 1993 c. 8/1/2013 D. $690 * 10% = 
69 Blah blah 

을 분할 할? 그런 부정적 예측의 주장은 당신이 원하는 무엇인가 :

reg = re.compile(r''' 
    (?xs)    # no need for i, but for s (dot matches newlines) 
    (\b\w\.\s*)   # e.g. A. or b. (word boundary to restrict to 1 letter) 
    ((?:(?!\b\w\.).)+) # everything until the next A. or b. 
    ''') 

findall() 함께 사용 : 당신이 a. 부분을 원하지 않는 경우

>>> reg.findall(s) 
[('a. ', '$1000 abcde!? '), ('B.  ', 'December \n 31, 1993 '), 
('c. ', '8/1/2013 '), ('D. ', '$690 * 10% = \n 69 Blah blah\n')] 

사용

reg = re.compile(r''' 
    (?xs)    # no need for i, but for s (dot matches newlines) 
    (?:\b\w\.\s*)  # e.g. A. or b. (word boundary to restrict to 1 letter) 
    ((?:(?!\b\w\.).)+) # everything until the next A. or b. 
    ''') 
+0

정규식은 사용법을 알고 있다면 정말 강력합니다. – Paul