2014-10-17 3 views
0

Моего кода:питона повторно подразделы против FindAll

import urllib 
import re 
xml = urllib.urlopen('url').read() 

Я заинтересован в удалении некоторых тегов и их содержимого из файла XML, следовательно, я пытаюсь использовать регулярные выражения.

, например:

re.findall(r'<fig(.*?)</fig>', xml, re.DOTALL) 

возвращает спички и не является пустым.

однако

re.sub(r'<fig(.*?)</fig>', ' ', xml, re.DOTALL) 

ничего не делает, то строка XML не изменяется. Я смущен, почему, пожалуйста, помогите.

+0

Возможный дубликат [Почему re.findall() найти больше совпадений, чем re.sub()?] (Http://stackoverflow.com/questions/16371472/why-does-re-findall-find-more- match-than-re-sub) – ErlVolton

+0

Просто улучшение. Разве вы не должны использовать хотя бы urllib2? –

+0

Я нашел ответ на SO путем поиска в Google точного названия вашего вопроса ... – ErlVolton

ответ

2

4-й параметр re.sub не является flags, но counts. Значение re.DOTALL равно 16 (по крайней мере, в Python 2.7/3.4). Таким образом, re.sub(.., re.DOTALL) заменит только 16 раз.

Указание flags как ключевые слова аргумент решить вашу проблему:

re.sub(r'<fig(.*?)</fig>', ' ', xml, flags=re.DOTALL) 

В дополнение к этому, re.sub возвращает заменить строку, а не изменить третий аргумент на месте. Убедитесь, что вы вернули возвращаемое значение функции.

+0

Wow! Brilliant. Спасибо за разъяснения! Никогда не знал. – suzee

0

Поскольку строки являются неизменяемыми в python, вам нужно назначить результат re.sub для новой переменной. Если вы не присвоите его новой переменной, вы не сможете получить желаемый результат.

Смежные вопросы