0

次のような構成ファイルを解析する必要があります (簡略化):

<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>

私の目標は、特定のリンクに固有のパラメーターを変更できるようにすることですが、置換を正しく機能させるのに問題があります。値がキャプチャ グループ 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)

したがって、

print re.search(final_regex, f_read).group(1)

ipsec を出力します

regex howto allの例は、キャプチャ グループを置換で使用することを想定しているように見えますが、必要なのはキャプチャ グループ自体を置換することです (たとえば、Link1 モードを ipsec から udp に変更します)。

4

4 に答える 4

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>

正規表現を見ると、これがまさにあなたがやりたいことであるかどうかはわかりませんが、BeautifulSoupのようなライブラリを使用する方が、正規表現にパッチを適用するよりもはるかに優れています。可能であれば、このルートを使用することを強くお勧めします。

于 2009-05-20T04:58:12.423 に答える
2

これは有効なXMLのように見えます。その場合、BeautifulSoupは必要ありません。正規表現は必要ありません。適切なXMLライブラリを使用してXMLをロードし、編集して印刷するだけです。ElementTreeを使用したアプローチは次のとおりです。

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。これが出力です。

<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>
于 2009-05-20T05:23:36.540 に答える
1

link_regex が正しいと仮定すると、次のように括弧を追加できます。

(<link [\w\W]+ %s>[\w\W]*[\w\W]*<%s>)([\w\W]*)(</%s>[\w\W]*</link>)

そして、次のことができます:

p = re.compile(link_regex)
replacement = 'foo'
print p.sub(r'\g<1>' + replacement + r'\g<3>' , f_read)
于 2009-05-20T04:47:16.777 に答える
0

そのようにするかどうかはわかりませんが、最も簡単な方法はキャプチャをシフトすることです:

([\w\W] [\w\W] <%s>)[\w\W] ([\w\W] )' を group1 +mode+group2 に置き換えます

于 2009-05-20T04:30:00.890 に答える