2011-09-02 4 views
1

다음 문자열이 있는데 괄호 사이에 요소 (xx = "yy")를 추출하고 싶습니다. 다음은 예입니다 :괄호 안의 요소와 괄호 사이의 요소 추출

[캡션 아이디 = "이"폭 = "이"캡션 = "및 이"정렬 "이 얻을"이 너무하시기 바랍니다 [/ 캡션]

나는 다음 코드를 시도했지만 정규식을 가진 꽤 멍청하다.

re.sub(r'\[caption id="(.*)" align="(.*)" width="(.*)" caption="(.*)"\](.*)\[\/caption\]', "tokens: %1 %2 %3 %4 %5", self.content, re.IGNORECASE) 

미리 감사드립니다.

답변

3

.*은 욕심이 많으므로 아마도 효과가 없을 것입니다. 대신 [^"]*을 시도해보십시오. [^"]은 따옴표 문자를 제외한 모든 문자 집합을 의미합니다. 또한 주석에서 지적한대로 토큰 구문은 %n이 아닌 \\n입니다. 이것을 시도하십시오 :

re.sub(r'\[caption id="([^"]*)" align="([^"]*)" width="([^"]*)" caption="([^"]*)"\](.*)\[\/caption\]', "tokens: \\1 \\2 \\3 \\4 \\5", self.content, re.IGNORECASE) 

캡션 태그의 내용이 여러 줄에 걸쳐 있습니까? 그들이 .*을하면 개보수를 포착하지 않습니다. 대신 [^\x00]*과 같은 것이 필요합니다. [^\x00]은 널 문자를 제외한 모든 charchter 세트를 의미합니다. 당신의 문자열이 실제로 합법적으로 널 문자를 포함 할 수 있습니다 오프 기회에

re.sub(r'\[caption id="([^"]*)" align="([^"]*)" width="([^"]*)" caption="([^"]*)"\]([^\x00]*)\[\/caption\]', "tokens: \\1 \\2 \\3 \\4 \\5", self.content, re.IGNORECASE) 

, 당신은 대신 re.DOTALL 플래그를 사용해야합니다.

+0

프로그래밍 언어에 따라 표현식에 NONGREEDY 수정 기호를 추가 할 수 있습니다. –

+2

좋은, 그 일을 했어! 또한 토큰 구문이 // %가 아닌 것을 잊어 버렸고 작동하지 않았습니다. re.sub (r '\ [caption id = "([^"] *) "align ="([^ "] *)"width = ","토큰 : \\ 1 \\ 2 \\ 3 \\ 4 "([^"] *) "캡션 = \\ 5 ", self.content, re.IGNORECASE) – Clash

+0

@Clash : 토큰 구문에 대한 부분을 포함하도록 답변을 업데이트했습니다. – Asaph

0

다음과 같이 시도해 볼 수 있습니까?

re = '[caption id="get this" align="and this" width="and this" caption="and this"]this too please[/caption]' 
re.gsub(/([a-z]*)=\"(.*?)\"/i) do |m| 
    puts "#{$1} = #{$2} 
end 
+1

그 언어는 무엇입니까? (http://chat.stackoverflow.com/rooms/3117/discussion-between-alan-moore-and-asaph) – glglgl

2

당신은 파이썬의 표준 SGML/HTML/XML 파싱 모듈의 전원을 활용할 수 있습니다, 당신은 위해이 대체 할 수 있습니다 "[]"에 대한 "<>"그것을 대체 할 안전한지 유효한 XML을 생산, 표준 라이브러리 XML 파싱 기능을 구문 분석 할 수 있습니다 :

import string 
from xml.etree import ElementTree as ET 

text = '[caption id="get this" align="and this" width="and this" caption="and this"]this too please[/caption]' 
xml_text = string.translate(text, string.maketrans('[]', '<>')) # Conversion to XML 
parsed_text = ET.fromstring(xml_text) # Parsing 

# Extracted information 
print "Text part:", parsed_text.text 
print "Values:", parsed_text.attrib.values() 

이 제대로 인쇄 :

Text part: this too please 
Values: ['and this', 'and this', 'get this', 'and this'] 

이 방법의 장점은 것입니다을 (1) 많은 사람들이 알고있는 표준 모듈을 사용합니다. (2) 명시 적으로 당신이하고 싶은 것을 보여줍니다; (3) 더 많은 정보를 쉽게 추출하고 더 복잡한 값 (큰 따옴표가 포함 된 값 포함)을 처리 할 수 ​​있습니다.