2014-12-26 2 views
3

필터링해야하는 형식이 올바르지 않은 텍스트가 있습니다. 따라서 텍스트의 인용문을 한 줄로 시작한 다음 두 번째 줄에서 잘라내어 끝내는 사례가 많이 있습니다. 이 경우, 부분적으로 따옴표를 완전히 제거하는 것이 좋습니다. 그러나 정규 전체 따옴표를 유지하려고합니다. 카운터를 사용하여 반복적으로 수행 할 수 있음을 알고 있지만 정규 표현식을 사용하는 것이 좋습니다. 파이썬 정규식 일치하는 부분 괄호 만

예 이물 보자

 
"This is a quote" 
This is an end "partial- 
quote" Here is more text. 
This is an end "partial- 
quote w/o more text" 
This is an "embedded" quote 

Here이 두 가지 상황에서 실패 나의 현재의 시도 (\"[^\"\n]+?|^[^\"\n]+?\")(\n|$) 참고로 예입니다

  1. 3 호선 - 부분 인용이의 나머지 부분을 진행 문장 (매우 희귀 한 사건, 그래서 우리가 해결할 수없는 경우 세계의 끝).
  2. 줄 6 - 포함 된 따옴표. 이것은 중요한 문제이며 내 문제로 인해 내가 취한 주된 이유입니다. 내장 된 따옴표의 마지막 인용문을 줄 끝으로 가져옵니다.

은 내가 if 문을 설정하고 부분적인 따옴표를 구문 분석을 진행 한 후 미만이 따옴표가있는 경우 확인하고,를 통해 각 라인을 실행,하지만 난 그렇게 많은 것의 마음을 생각 수 있다고 생각 클리너 솔루션.

원하는 출력은 다음과 같습니다

 
"This is a quote" 
This is an end 
Here is more text. 
This is an end 
This is an "embedded" quote 

다음
+0

어쩌면 내가 제안한 정규식을 확인할 수 있습니까? – Jerry

답변

2

가고,

^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|) 

\1\n

과 일치하는 문자를 교체합니다 (I는 공백 이후-에 대한 처리)

DEMO

>>> import re 
>>> s = '''"This is a quote" 
This is an end "partial- 
quote" Here is more text. 
This is an end "partial- 
quote w/o more text" 
This is an "embedded" quote''' 
>>> m = re.sub(r'(?m)^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"[^"\n]*\n[^"\n]*"(\n|)', r'\1\n', s) 
>>> print(m) 
"This is a quote" 
This is an end 
Here is more text. 
This is an end 
This is an "embedded" quote 

사용하면 따옴표 사이의 내부에 존재 하나 개 이상의 라인을 처리하려면이 정규식.

^((?:[^"\n]*"[^"\n]*")*[^"\n]*)"(?:[^"\n]*\n)+[^"\n]*"(\n|) 

DEMO

+0

죄송합니다, 방금이 문제를 해결하기 시작했습니다. 그것은 닫는 따옴표에 의존하지 않는 것이 가능합니까? 나는. 이 작동하지 않습니다 : https://regex101.com/r/tQ4oW4/1 – andoni

+0

오, 그것은 이중 따옴표의 홀수가 있습니다 .. 그것은 불가능합니다. –

+0

편집 : 신경 쓰지 마세요. 나는 당신이 정말로 그것이 어느 부분인지를 알 수 없다고 생각합니다. 고맙습니다! – andoni

1

당신은 아마이 정규식 사용할 수 있습니다

"[^"\n]+?\n[^"\n]+?(?:"|$)\s* 

\n로 교체.

regex101 demo

"[^"\n]+?\n[^"\n]+?은 단지 부분적인 따옴표 일치 (따옴표 사이에 줄 바꿈이의 보장)합니다.

ideone demo

1
("[^"\n]*")|"[^"]*(\n)[^"]*"(?![^\n]*")|"[^"]*\n.*?(?=\n[^"]*"[^\n"]*") 

당신은 시도 할 수 있습니다 이걸는 well.See 데모로 따옴표의 홀수의 경우 소요됩니다.

https://regex101.com/r/dL7oF8/6

+0

@andoni 당신은 홀수 개의'''로 이것을 시도 할 수 있습니다 – vks

관련 문제