тег регулярного выражения python - PullRequest
0 голосов
/ 16 апреля 2011

Я хочу изменить эту строку

<p><b> hello world </b></p>. I am playing <b> python </b>

на:

<bold><bold>hello world </bold></bold>, I am playing <bold> python </bold>

Я использовал:

import re 

pattern = re.compile(r'\<p>(.*?)\</p>|\<b>(.*?)\</b>')

print re.sub(pattern, r'<bold>\1</bold>', "<p><b>hello world</b></p>. I am playing <b> python</b>")

Он не выводит то, что я хочу, он жалуется на ошибку: несопоставленная группа

Работает в этом случае:

re.sub(pattern, r'<bold>\1</bold>', "<p>hello world</p>. I am playing <p> python</p>")

<bold> hello world </bold>.Я играю <bold> python</bold>

Ответы [ 3 ]

5 голосов
/ 16 апреля 2011

Если вы решите не использовать регулярные выражения, тогда все просто:

d = {'<p>':'<bold>','</p>':'</bold>','<b>':'<bold>','</b>':'</bold>'}
s = '<p><b> hello world </b></p>. I am playing <b> python </b>'
for k,v in d.items():
    s = s.replace(k,v)
3 голосов
/ 16 апреля 2011

Хотя я не рекомендую использовать Regex для разбора HTML (для этого есть библиотеки почти на каждом языке), это должно работать:

text = "<p><b> hello world </b></p>. I am playing <b> python </b>"

import re 

pattern1 = re.compile(r'\<p>(.*?)\</p>')
pattern2 = re.compile(r'\<b>(.*?)\</b>')

replaced = re.sub(pattern1, r'<bold>\1</bold>', text)
replaced = re.sub(pattern2, r'<bold>\1</bold>', replaced)

Думаю, проблема в том, что Python использует группы. Проверьте следующее, и вы поймете, что я имею в виду:

text = "<p><b> hello world </b></p>. I am playing <b> python </b>"

import re 

pattern = re.compile(r'\<p>(.*?)\</p>|\<b>(.*?)\</b>')

for match in pattern.finditer(text):
  print match.groups()

Вы увидите следующее:

('<b> hello world </b>', None) # Here captured the 1st group
(None, ' python ') # Here the 2nd ;)

И, в любом случае, примите во внимание, что сначала он соответствует тому, что находится между <p></p>, поэтому он принял <b> hello world </b> (что-то, что вы тоже хотите сопоставить) в качестве первого совпадения. Возможно, изменение порядка скомпилированных регулярных выражений в pattern решит эту проблему, но может произойти обратное (имея <b><p> ... </p></b>)

Хотелось бы предоставить больше информации, но я не очень хорош в регулярных выражениях с использованием Python. C # воспринимает их по-другому.

Edit:
Я понимаю, что вы, возможно, захотите сделать это с помощью регулярных выражений для целей обучения / тестирования, не знаю, но в рабочем коде я бы выбрал другую альтернативу (например, ту, что дал вам @Senthil) или просто использовал HTML Parser .

2 голосов
/ 16 апреля 2011

Проблема в том, что первая группа находится в пределах <p></p>, а вторая группа находится в пределах <b></b> в регулярном выражении.Однако в вашей замене вы имеете в виду первую группу, когда, если она соответствует <b></b>, ее не было.Я предлагаю пару решений.

Сначала

>>> pattern = re.compile(r'<(p|b)>(.*?)</\1>')
>>> print re.sub(pattern, r'<bold>\2</bold>', 
                 "<p><b>hello world</b></p>. I am playing <b> python</b>")
<bold><b>hello world</b></bold>. I am playing <bold> python</bold>

будет соответствовать данной паре тегов.Однако, как вы можете видеть, его нужно будет дважды использовать в строке, потому что, когда он соответствует тегам <p></p>, он пропускает вложенные теги <b></b>.

Вот вариант, который я хотел бы использоватьс:

>>> pattern = re.compile(r'<(/?)[pb]>')
>>> print re.sub(pattern, r'<\1bold>', 
                 "<p><b>hello world</b></p>. I am playing <b> python</b>")
<bold><bold>hello world</bold></bold>. I am playing <bold> python</bold>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...