首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用re.sub (或regexobject.sub)来替换子组中的文本?

是否可以使用re.sub (或regexobject.sub)来替换子组中的文本?
EN

Stack Overflow用户
提问于 2009-05-20 04:20:04
回答 4查看 517关注 0票数 0

我需要解析一个配置文件,如下所示(简化):

代码语言:javascript
复制
<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>

我的目标是能够更改特定于特定链接的参数,但我无法让替换正确工作。我有一个regex,它可以隔离特定链路上的参数值,其中该值包含在捕获组1中:

代码语言:javascript
复制
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)

因此,

代码语言:javascript
复制
print re.search(final_regex, f_read).group(1)

打印ipsec

regex howto中的示例似乎都假设要在替换中使用捕获组,但我需要做的是替换捕获组本身(例如,将Link1模式从ipsec更改为udp)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-20 04:30:01

我不确定我是否会这样做,但最快的方法是移动捕获:

(\w\W\w\W<%s>)\w\W(\w\W)‘并替换为group1 +mode+group2

票数 0
EN

Stack Overflow用户

发布于 2009-05-20 04:58:12

我必须告诉你:“不要使用正则表达式来做这件事。”

看看用BeautifulSoup做这件事有多容易,例如:

代码语言:javascript
复制
>>> 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>

看看你的正则表达式,我真的不知道这是否是你想要做的,但是不管你想做什么,使用像BeautifulSoup这样的库要比尝试拼凑一个正则表达式要好得多。如果可能的话,我强烈建议你走这条路。

票数 6
EN

Stack Overflow用户

发布于 2009-05-20 05:23:37

这看起来像是有效的XML,在这种情况下,您不需要BeautifulSoup,绝对不需要正则表达式,只需使用任何好的XML库加载XML,编辑它并打印出来,下面是使用ElementTree的方法:

代码语言:javascript
复制
import xml.etree.cElementTree as ET

s = """<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>
"""
configElement = ET.fromstring(s)

for modeElement in configElement.findall("*/*/*/mode"):
    modeElement.text = "udp"

print ET.tostring(configElement)

它会将所有模式元素更改为udp,这是输出:

代码语言:javascript
复制
<config>
<links>
<link id="1" name="Link1">
 <encapsulation>
  <mode>udp</mode>
 </encapsulation>
</link>
<link id="2" name="Link2">
 <encapsulation>
  <mode>udp</mode>
 </encapsulation>
</link>
</links>
</config>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/886111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档