2016-11-16 6 views
0

Я пытаюсь получить несколько слов в тегах html. Для instace как это:Python regex sub несколько раз

<title>GateUser UserGate</title> 

Я хочу Cath как 'GateUser' и 'UserGate' Я использую следующий регулярное выражение:

re.sub(ur'(<.*>.*)(\b\w{8}\b)(.*</.*>)', r'\1\g<2>ADDED\3', html) 

Я хотел бы заменить любое слово внутри HTML тег, который соответствует этому \b\w{8}\b состоянии, re.sub допускает только один.

+2

Рука 're.sub' четвертый параметр:' re.GLOBA L'. – L3viathan

+0

непонятно, не могли бы вы немного разобраться? вы хотите заменить слова или что-нибудь внутри тега? –

+1

Regex и html не сочетаются вместе ([обязательная ссылка] (https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)). Почему бы вам не использовать синтаксический анализатор html для получения текстового содержимого тега, а затем изменить только это? – mata

ответ

1

Использование re для разбора HTML не действительно необходимо, как у вас есть много блестяще написанных библиотек для этого, но все же, как вы можете добиться того, что вы хотите от:

  • разборе тегов.
  • изменить их innerHtml.

Допустим, у вас есть некоторые HTML:

a = """ 
    <title>GateUser UserGate</title> 
    <div style="something"> 
    KameHame Ha 
    </div> 
    """ 

Теперь вы можете относительно легко разобрать теги включая innerHtml:

blanks = r"([\s\n\t]+?)" # totally optional depending on code indentation and stuff. 
pat = re.compile(r"(<.+>){0}(.*?){0}(</.+>)".format(blanks)) 

# tuples don't support item assignment, so mapping list, but still tuples fine too. 
tags_with_inner = list(map(list, pat.findall(a))) 

# [ ['<title>', '', 'GateUser UserGate', '', '</title>'], 
# ['<div style="something">', '\n ', 'KameHame Ha', '\n ', '</div>']] 

И тогда они соответствовали вашим regex на внутренний только:

only_inner = re.compile(r"\b\w{8}\b") # your expression 

for inner in tags_with_inner: 
    inner[2] = only_inner.sub("ADDED", inner[2]) 
    print ("".join(inner)) 

# <title>ADDED ADDED</title> 
# <div style="something"> 
#  ADDED Ha 
# </div> 
+0

Ok. Как я могу получить оригинальный html, но с замененными вещами? Это главное, что меня волнует –

+0

и его лучше использовать модули парсера html/xml для этого, потому что вы просто делаете для вас все труднее. Попробуйте модуль 'lxml' на pypi, его красивый спуск. –

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