Как мне убедиться, что я всегда получаю список совпадений из регулярных выражений Python? - PullRequest
0 голосов
/ 03 марта 2010

Я пытаюсь получить некоторую информацию (без необходимости рекурсии) со страницы jsp (искаженный xml), подобную этой:

<td>
<html:button ...></html:button>
<html:submit ...></html:submit></td>

И регулярное выражение:

<html:(button|submit|cancel)[\s\S]*?</html:(button|submit|cancel)>

re.findall () дает мне список кортежей, вот так:

[('button','button'),('button','button')]

То, что я понимаю из документации, правильно, но я ищу что-то похожее на:

["<html:button ...>","<html:button ...>"]

Как правильно получить ожидаемый результат?

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

Помимо того факта, что регулярное выражение, вероятно, не то, с чем вы хотите это сделать, вы хотите поместить нужный бит в группы в круглых скобках. Если вам нужно все до закрывающего тега </html:whatever>, то вам нужно что-то вроде этого:

(<html:(button|submit|cancel)[\s\S]*?)</html:(button|submit|cancel)>

Если вам нужен бит <html:button>, используйте:

(<html:(button|submit|cancel)>)[\s\S]*?</html:(button|submit|cancel)>

, например

от

<html:button>foobar</html:submit>

вы получите:

('<html:button>', 'button', 'submit')

Если вы хотите получить foobar сверху, используйте:

(<html:(button|submit|cancel)>)([\s\S]*?)</html:(button|submit|cancel)>

чтобы получить:

('<html:button>', 'button', 'foobar', 'submit')

Обратите внимание, что в общем случае невозможно сопоставить открывающий и закрывающий теги (обратите внимание, что <html:button> открывается, а </html:submit> закрывается в примере выше). Если вам нужно это сделать, используйте правильный парсер.

1 голос
/ 03 марта 2010

Ваш (button|submit|cancel) получает захват, поэтому добавьте ?: в скобках, например (?:

>>> re.findall('<html:(?:button|submit|cancel)[\s\S]*?</html:(?:button|submit|cancel)>',TheHTMLWhichShouldntParseWithRegex)
['<html:button ...></html:button>', '<html:submit ...></html:submit>']
...