2013-08-08 7 views
1

저는 파이썬에 대해 상당히 익숙합니다. 그렇기 때문에 초보자 분들께서 사과하겠습니다 만, 원시 텍스트 파일의 특정 형식을 가진 괄호에서 텍스트를 추출하려고합니다. 정규 표현식으로 시도했지만 더 나은 방법인지 알려주세요.특정 형식의 괄호를 파이썬으로 추출하기

['(Stackoverflow, 2013)', '(Stackoverflow, 1999)'] 

지금까지 시도 정규 표현식은

이다 : 나는 같은 결과 뭔가를 원하는 문자열에서

s = "Testing (Stackoverflow, 2013). Testing (again) (Stackoverflow, 1999)" 

:

내가 예에 의해 수행 할 작업을 표시하려면
"(\(.+[,] [0-9]{4}\))" 

을 re.findall()과 함께 사용하면이 결과 만 제공됩니다.

['(Stackoverflow, 2013). Testing (again) (Stackoverflow, 1999)'] 

짐작할 수 있겠지만 .txt 파일에서 서지 정보를 추출하려고합니다. 그러나 저는 서지 참조가 아닌 괄호 안에있는 것을 추출하고 싶지 않습니다.

초심자 인 경우 다시 사과 드리며, 이미 이와 같은 질문이있는 경우 다시 사과드립니다. 나는 수색했지만 행운은 아직 없다.

답변

0

당신이 그렇게 같은 것을 사용할 수 있습니다, 당신은 중첩 된 괄호가없는 것으로 가정. 이것은 괄호 안에있는 괄호가 아닌 문자와 일치하며 그 뒤에 쉼표, 공백 4 자리 및 닫는 괄호가옵니다.

+0

아 우수. 설명해 주셔서 감사합니다! 네, 중첩 된 괄호는 없습니다. 그러나 귀하의 응답이 어떻게 바뀌 었습니까? – SamPassmore

+0

@SamPassmore : 다행스럽게도 다행이다. 이것 때문에 바뀔 것입니다 :'[^()]'. 이렇게하면 다른 괄호 집합에 이미 포함 된 괄호와 일치하지 않도록 엔진에 요청하므로 중첩을 위해 변경해야 할 수 있습니다. – npinti

1

. 대신 [^()]을 사용하십시오. 이렇게하면 중첩 된()이 없는지 확인할 수 있습니다. (\([^()]+?, [0-9]{4}\)) :

>>> re.findall("(\([^()]+[,] [0-9]{4}\))", s) 
['(Stackoverflow, 2013)', '(Stackoverflow, 1999)'] 
+0

감사! 저것은 우수하게, 그리고 내 전체 텍스트 파일에서도 잘 작동합니다. "[^()] +"의 작동 원리를 설명해 주시겠습니까? – SamPassmore

0

나는 \(\w+,\s+[0-9]{4}\)과 같은 것을 제안합니다. 원본과 몇 가지 변경 사항 :

  • 원본 이름의 문자 대신 단어 문자 (문자/숫자/밑줄)를 일치시킵니다.
  • 하나의 리터럴 공간으로 제한하는 대신 쉼표 뒤에 하나 이상의 공백 문자를 일치시킵니다.
관련 문제