python正则表达式标记

| 我想改变这个字符串
<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>
    
已邀请:
尽管我不建议使用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如何采用Groups。 测试以下内容,您将明白我的意思:
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#采取不同的方式。 编辑: 我了解您可能不知道要使用正则表达式来实现此目的,但是在生产代码中,我会选择另一种方法(例如@Senthil给您的方法)或仅使用HTML解析器。     
如果选择不使用正则表达式,则如下所示:
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)
    
问题是因为在正则表达式中,第一组在ѭ9内,而第二组在ѭ15内。但是,在您的替换中,您指的是第一组,如果它与
<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>
    

要回复问题请先登录注册