我可以使用re.sub(或regexobject.sub)替换子组中的文本吗?

Rob*_*arr 0 python regex regex-group

我需要解析一个看起来像这样的配置文件(简化):

<config>
<links>
<link name="Link1" id="1">
 <encapsulation>
  <mode>ipsec</mode>
 </encapsulation>
</link>
<link name="Link2" id="2">
 <encapsulation>
  <mode>udp</mode>
 </encapsulation>
</link>
</links>
Run Code Online (Sandbox Code Playgroud)

我的目标是能够更改特定链接的参数,但是我无法让替换正常工作.我有一个正则表达式,可以隔离特定链接上的参数值,其中值包含在捕获组1中:

link_id = r'id="1"'
parameter = 'mode'
link_regex = '<link [\w\W]+ %s>[\w\W]*[\w\W]*<%s>([\w\W]*)</%s>[\w\W]*</link>' \
% (link_id, parameter, parameter)
Run Code Online (Sandbox Code Playgroud)

从而,

print re.search(final_regex, f_read).group(1)
Run Code Online (Sandbox Code Playgroud)

打印ipsec

正则表达式中的示例似乎都假设人们想要在替换中使用捕获组,但我需要做的是替换捕获组本身(例如,将Link1模式从ipsec更改为udp).

Pao*_*ino 6

我必须给你强制性的要求:"不要使用正则表达式来做到这一点."

看看使用BeautifulSoup这么做是多么的棒,例如:

>>> from BeautifulSoup import BeautifulStoneSoup
>>> html = """
... <config>
... <links>
... <link name="Link1" id="1">
...  <encapsulation>
...   <mode>ipsec</mode>
...  </encapsulation>
... </link>
... <link name="Link2" id="2">
...  <encapsulation>
...   <mode>udp</mode>
...  </encapsulation>
... </link>
... </links>
... </config>
... """
>>> soup = BeautifulStoneSoup(html)
>>> soup.find('link', id=1)
<link name="Link1" id="1">
<encapsulation>
<mode>ipsec</mode>
</encapsulation>
</link>
>>> soup.find('link', id=1).mode.contents[0].replaceWith('whatever')
>>> soup.find('link', id=1)
<link name="Link1" id="1">
<encapsulation>
<mode>whatever</mode>
</encapsulation>
</link>
Run Code Online (Sandbox Code Playgroud)

看看你的正则表达式,我无法确定这是否是你想要做的,但无论你想做什么,使用像BeautifulSoup这样的库比试图拼凑正则表达式要好得多.我强烈建议尽可能走这条路.