Помощь в многострочном сопоставлении регулярных выражений - PullRequest
0 голосов
/ 16 августа 2010

Я пытаюсь, чтобы регулярное выражение совпадало со значением, которое занимает несколько строк. Я использую флаг re.S, но все еще не получаю результатов. Есть идеи почему?

Это текст, который я ищу:

<File id="abc.txt" EngRev="74">
  <Identifier id="STRING_ID" isArray="1" goesWith="3027253">
    <EngTranslation>"Value 1","Value 2","Value 3","Value 4","Value 5",</EngTranslation>
    <LangTranslation filename="abc.txt" key="STRING_ID 0">Value 1</LangTranslation>
    <array filename="abc.txt" key="STRING_ID 1">Value 2</array>
    <array filename="abc.txt" key="STRING_ID 2">Value 3</array>
    <array filename="abc.txt" key="STRING_ID 3">Value 4</array>
    <array filename="abc.txt" key="STRING_ID 4">Value 5</array>
  </Identifier>
  <Identifier id="STRING_ID2" isArray="0" goesWith="3027253">
    <EngTranslation>"Value 1"</EngTranslation>
    <LangTranslation filename="abc.txt" key="STRING_ID2">Value 1</LangTranslation>
  </Identifier>
</File>

Это код, который я использую для получения соответствия:

def updateToArray(matchobj):
     return matchobj.group(0).replace('LangTranslation','array')
outXML = re.sub(r'<Identifier.*?<array.*?</Identifier>', updateToArray, outXML, re.S)

Ответы [ 2 ]

7 голосов
/ 16 августа 2010

Я настоятельно призываю вас не использовать регулярные выражения для анализа XML.У SO есть lot из веток вопросов / ответов, объясняющих почему.Например, см. этот классический .

Поскольку вы используете Python, почему бы не использовать такие библиотеки, как BeautifulSoup или Lxml , чтобы выполнять работу намного более чистои кратко?

1 голос
/ 17 августа 2010

Вам не хватает аргумента:

re.sub(pattern, repl, string[, <b>count</b>, flags])

Флаги выглядят как целые числа, поэтому он обрабатывает re.S как аргумент count.Использование нуля для count сохраняет поведение по умолчанию и позволяет передавать флаги в качестве пятого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...