Проблема специальных символов в регулярных выражениях python - PullRequest
2 голосов
/ 01 марта 2011

Я применяю некоторые регулярные выражения к XML-файлу, чтобы найти и заменить значения.Обычно это работает. (Я слышал голоса, говорящие "использовать парсеры xml". Между тем я не могу.) Но если в значении есть специальный символ, он разрушает все.

Думаю, у меня есть xml-файл, как показано ниже:

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

Если я пытаюсь заменить значение в узле "<idle2><value>", значение узла "<idle1><value>" становится чем-то \п».И когда дело доходит до записи в файл, 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.replacePattern=`\g<1>\g<2>\g<3>\g<4><value>denemeasdasd\\\\n</value>\g<8>\g<9>\g<10>\g<11>`

это код Python для поиска:

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

и это для замены

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

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Я не понимаю ваших объяснений.

Personnaly, я написал это:

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)

результат

'<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>

Это то, что вы хотите?

0 голосов
/ 01 марта 2011

Лучше всего, когда я имею дело с непредсказуемыми источниками данных, чтобы белый список допустимых символов. Поэтому наряду с другими заменами регулярных выражений удалите все, что не занесено в белый список, т.е. a-z 0-9:,. -

Просмотрите ваши данные и определите подходящий белый список для вашей задачи.

...