2012-08-07 3 views
0

다른 경기 전에 경기의 발생 :정규식/파이썬 : N -이 같은 XML 파일의 구조를 가지고

<word id="15" pos="SS"> 
      <token>infarto</token> 
      <lemmas>infarto</lemmas> 
     </word> 
     <word id="16" pos="AS"> 
      <token>miocardico</token> 
      <lemmas>miocardico</lemmas> 
     </word> 
     <word id="17" pos="AS" annotated="head"> 
      <token>acuto</token> 
      <lemmas>acuto</lemmas> 
     </word> 
     <word id="18" pos="E"> 
      <token>in</token> 
      <lemmas>in</lemmas> 
     </word> 
     <word id="19" pos="SS"> 
      <token>corso</token> 
      <lemmas>corso</lemmas> 
     </word> 

나는, "POS"와 "토큰에 대한 값을 받고 할 노력하고있어 "라는 단어가 17 번 단어 (annotated ="head "하나)라는 단어를 둘러싼 단어를 가리 킵니다.

은 모든 문제는 단어 뒤에오고 일치이다 (17)

(pos=")(.+)(")(\s\S+?)("head")([\s\S]+?)(>)(\w+?)(<+)([\S\s]+?)(pos=")(.+)(")([\s\S]+?) (token>)(.+)(<)([\s\S]+?) 

이 내가 원하는 모든 정보를 저를 얻고 I 확장 할 경우 난 그냥에

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?) 

을 추가 할 수 있습니다 종료. 그것은 예쁘지 않지만 작동합니다. 나는 다른 방향으로 가고 싶어 갈 때

는 지금, 나는 절대적으로 그것을 단어 16 ("주석 머리"앞에있는 첫 번째)의 정보와 일치하는 대신

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?)(pos=")(.+)(")(\s\S+?)("head") 

을 난처한 상황에 빠진거야 앞에 오는 모든 정보 (단어 15, 단어 14, 단어 13 등)와 일치합니다.

무엇이 누락 되었습니까?

P. XML 파서를 사용하는 것은 슬프게도 옵션이 아닙니다.

+4

regexes가 아닌이 유형의 작업에 XML 라이브러리를 사용해야합니다. – armandino

+3

당신은 html이나 xml을위한 정규 표현식을 사용해서는 안됩니다. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

http://stackoverflow.com/questions/6751105/why-its-not-possible- 사용법 -regex-to-parse-html-xml-a-formal-explanation-in-la –

답변

0

가 내가 그런 것을해야한다고 생각 : 결과

(?s)(<word(?:(?!<word).)*)<word[^>]*?annotated="head".*?(<word[^>](?:(?<!</word>).)*) 

, 그룹 # 1 의지 ID로 = 18

을 노드 "단어"를 포함 식 (16)와 그룹 # 2 노드 "단어를"포함

는 그런 별도로 다음과 같은 정규 표현식을 사용하여 이러한 각 노드를 구문 분석 할 수 있습니다 :

(?s)<word[^>]*?pos="(?P<pos>[^"]+).*?<token>(?P<token>[^<]+) 

당신은 두 개의 그룹 'POS'와 '토큰'을 얻을 것이다.

물론 하나의 정규식을 사용할 수 있지만 꽤 추해 보일 것입니다.

+0

고마워요! 저것은 주문처럼 작동했습니다! – lhausmann

0

데이터가 올바른 형식의 XML인지 확인한 경우. 나는 그것이 가능하다고 생각, 다음 단계를 수행하십시오

1 단계 : <word[^>]*>([^<]*(?:(?!<\/?word)<[^<]*)*)<\/word> (REF http://regexr.com?31org)
2 단계 : <token[^>]*>([^<]*(?:(?!<\/?token)<[^<]*)*)<\/token> (REF http://regexr.com?31ora) 또는 <lemmas[^>]*>([^<]*(?:(?!<\/?lemmas)<[^<]*)*)<\/lemmas> (REF http://regexr.com?31ord로 1 단계 (1 군)와 경기에서 문자열을 얻을)

당신은 당신의 필요 조건 :

참조 이러한 패턴을 수정하려고 수 : 3 마스터 정규 표현식을

관련 문제