2011-03-01 4 views
2

xml 파일에 정규 표현식을 적용하여 값을 찾아서 바꿉니다. 일반적으로 작동합니다. ("XML 파서 사용"이라는 목소리가 들려 왔지만 그럴 수는 없습니다.)하지만 값에 특수 문자가 있으면 모든 것이 파손됩니다.파이썬에 의한 regexp의 특수 문자 문제

<fieldset> 
    <idle1> 
    <value>something\\n</value> 
    </idle1> 
    <idle2> 
    <value>blabla</value> 
    </idle2> 
</fieldset> 

나는 "<idle2><value>"노드 값 "<idle1><value>"노드가된다 "뭔가 \ n을"의 값을 대체하려고하면 :

내가 XML 파일을 아래와 같이 생각. 그리고 파일을 쓸 때 xml은 다음과 같습니다.

<fieldset> 
     <idle1> 
     <value>something 
</value> 
     </idle1> 
     <idle2> 
     <value>blabla</value> 
     </idle2> 
    </fieldset> 

글쎄, 둘 다 "r"문자열 리터럴을 사용합니다. 하지만 작동하지 않는 것 같습니다. 나는 그 문제를 해결한다. 검색과 바꾸기마다 "\ n"을 "\\n"으로 바꾼 다음 그 결과를 파일에 씁니다. 그러나 사용하는 효율적인 방법은 아닙니다.

내가 볼 수없는 것이 있습니까? 파일에 "\\n"이라고 쓰고 싶습니다. 이게 내가 원했던가?

편집 : 검색

:

self.searchPattern=(<fieldset>)(.*?)(<idle2>)(.*?)(<value>)(.*?)(</value>)(.*?)(</idle2>)(.*?)(</fieldset>) 

에 대한 대체 :

self.pattern = re.compile(r''''''+self.searchPattern+'''''', flags = re.S | re.U) 
:

self.replacePattern=`\g<1>\g<2>\g<3>\g<4><value>denemeasdasd\\\\n</value>\g<8>\g<9>\g<10>\g<11>` 

이 검색의 파이썬 코드 여기 내 정규식 등에서 특정 요소를 뽑아 오기가 '있다

그리고 이것은 replac을위한 것입니다. ing

outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(0)+'''''') 

답변

1

귀하의 설명을 이해할 수 없습니다.

'<fieldset>\n <idle1>\n <value>something\\n</value>\n </idle1>\n <idle2>\n <value>blabla</value>\n </idle2>\n</fieldset>' 

<fieldset> 
    <idle1> 
    <value>something\n</value> 
    </idle1> 
    <idle2> 
    <value>blabla</value> 
    </idle2> 
</fieldset> 

------------------------------------------------- 
'<fieldset>\n <idle1>\n <value>something\\n</value>\n </idle1>\n <idle2>\n <value>AAA</value>\n </idle2>\n</fieldset>' 

<fieldset> 
    <idle1> 
    <value>something\n</value> 
    </idle1> 
    <idle2> 
    <value>-----HHHHHHXXXXXXX-------</value> 
    </idle2> 
</fieldset> 

당신이 원하는 무엇인가

import re 

RE = ('(^([ \t]+)<(idle2)>(?:\n|\r\n?)[ \t]+<value>)' 
     '(.*?)' 
     '(?=</value>(?:\n|\r\n?)\\2</\\3>)') 

print repr(ch),'\n' 
print ch 
print '\n-------------------------------------------------' 
print repr(re.sub(RE,'\\1AAA',ch,flags = re.M)) , '\n' 
print re.sub(RE,'\\1-----HHHHHHXXXXXXX-------',ch,flags = re.M) 

결과 :

PERSONNALY, 나는이 쓴?

+0

이것은 나를 도울 수 있습니다. 고맙습니다. – savruk

+0

@savruk 고맙습니다. 정말 좋은 대답이고 가장 좋은 답변이라면 삼각형의 하향식 버튼 아래에있는 흰 갈매기 버튼을 클릭하여 수락 할 수 있습니다. 그것은 10 대신에 25 포인트에 응답합니다. – eyquem

+0

@savruk Thanks. 나는 포인트에 사로 잡히지 않지만, 어리 석음을 너무 많이 걱정하지 않고 다른 대답에 대해 싫어하는 것을 허락하는 데 허용하고있다 (예, 나는 바보 같은 대답을했다) – eyquem

0

예기치 않은 데이터 원본을 처리하여 유효한 문자를 허용하는 것이 가장 좋습니다. 다른 대체 정규 표현식을 계속 사용하면서 함께 허용 목록에없는 항목 즉 a-z 0-9 :,를 제거하십시오. -

데이터를보고 작업에 적합한 화이트리스트를 결정하십시오.

+0

음, 내가하는 일은 당신이 설명하는 것과 비슷합니다. 하지만 정규식에서 그것을 처리 할 수있는 방법이 있어야합니다. – savruk

+0

내 방법을 사용하기 전에 대체하기 전에 정규식을 사용하여 흰색이 아닌 모든 문자를 ''로 대체하십시오. 그렇다면 현재 코드에서 숨겨진 문자 나 특수 문자를 처리하는 것에 대해 걱정할 필요가 없습니다. 행운을 빌어 당신이 가지고있는 어떤 것도 바꿀 필요가 없습니다. – xzyfer

+0

@savruk

, , , , , 사이의 연결은 무엇입니까? \ g <1> 등의 의미는 무엇입니까? 이것은 무엇입니까 : denemeasdasd? self.searchPattern이란 무엇입니까? ..... ?? – eyquem