2012-02-26 2 views
0

인용구 사이에 모든 것을 얻기 위해 파이썬에서 정규 표현식을 사용하는 방법을 아는 사람이 있습니까? 예를 들어견적 내에서 모든 것을 얻기 위해 정규 표현식을 작성하는 방법

, 텍스트 : "여기에 몇 가지 텍스트".... 텍스트 ... 텍스트 : "일부 번호 - 여기 2343- 너무"

텍스트 있습니다 "여기에 더 많은 텍스트!" 길이가 다르며 구두점과 숫자도 포함되어 있습니다. 모든 정보를 추출하기 위해 정규 표현식을 작성하려면 어떻게해야합니까?

나는 컴파일러에서보고 싶은 것 :

여기 여기 더 많은 텍스트 텍스트 일부 번호 - 2343 - 여기이 당신을 위해 작동합니다 너무

답변

7

:

"(.*?)" 

* 뒤에 ?을 배치하면 가능한 한 일치하지 않도록 제한되므로 따옴표를 사용하지 않습니다.

>>> r = '"(.*?)"' 
>>> s = 'text: "some text here".... text: "more text in here!"... text:"and some numbers - 2343- here too"' 
>>> import re 
>>> re.findall(r, s) 
['some text here', 'more text in here!', 'and some numbers - 2343- here too'] 
7

입니다 "[^"]*", ""에 의해 followe하지 "입니다 0 개 이상의 항목, 다음 해보십시오. 그래서 :

pat = re.compile(r'"[^"]*"'). 
+0

나는 Karl의 대답이 내 것보다 낫다. 고마워, 칼 – Pierce

1

인용 하위 문자열 이스케이프 문자, 다음 두 칼 바커의와 피어스의 응답 것 모두 일치 제대로 포함되지 않은 일치하는 경우. 그러나, 두 가지의 피어스의 표현이 더 효율적입니다 :

reobj = re.compile(r""" 
    # Match double quoted substring (no escaped chars). 
    "     # Match opening quote. 
    (     # $1: Quoted substring contents. 
     [^"]*    # Zero or more non-". 
    )     # End $1: Quoted substring contents. 
    "     # Match closing quote. 
    """, re.VERBOSE) 

그러나 인용 하위 문자열이 일치 할 경우 않습니다

문자를 탈출 포함, (예를 들어, "그녀는 말했다 : \"\ 안녕 "나에게 \ n. "), 당신은 다른 표현이 필요합니다 :

reobj = re.compile(r""" 
    # Match double quoted substring (allow escaped chars). 
    "     # Match opening quote. 
    (     # $1: Quoted substring contents. 
     [^"\\]*   # {normal} Zero or more non-", non-\. 
     (?:    # Begin {(special normal*)*} construct. 
     \\.    # {special} Escaped anything. 
     [^"\\]*   # more {normal} Zero or more non-", non-\. 
    )*    # End {(special normal*)*} construct. 
    )     # End $1: Quoted substring contents. 
    "     # Match closing quote. 
    """, re.DOTALL | re.VERBOSE) 

이 내가 트릭을 할 것 알고 있어요 여러 표현이 있지만, 위의 (MRE3에서 촬영 한) 무리의 가장 효율적이다 . 이 다양하고 기능적으로 동일한 표현을 비교하는 my answer to a similar question을 참조하십시오.

관련 문제