2009-05-20 10 views
0

私はこの(簡体字)のように見える設定ファイル解析する必要があります:私の目標は、特定のリンクに固有のパラメータを変更できるようにすることですが、私は置換が正しく動作するのに問題を抱えているre.sub(またはregexobject.sub)を使用して、サブグループ内のテキストを置き換えることはできますか?

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

を。したがって

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

例:私は値がキャプチャグループ1に含まれている特定のリンク上でパラメータ値を単離することができる正規表現を持っていますregex howtoでは、すべてが置換でキャプチャグループを使用したいと思っているようですが、キャプチャグループ自体を置き換えるだけです(Link1モードをipsecからudpに変更するなど)。

+0

置換文字列が機能しました。 –

+0

なぜ私はregの代わりにいくつかのXMLライブラリを使用しないでください知って興味がありますか? –

+0

XMLの知識が限られていることや、他の開発者が正規表現を使って問題を解決する方法が正解であることなど、いくつかの要因があります。つまり、実装するのが比較的簡単だと思われるので、BeautifulSoupオプションを使用することもできます。 –

答えて

0

ない私はそのようにそれを行うだろうが、最も簡単な方法は、キャプチャをシフトするだろうしてください:

([\ W \ W] [\ W \ W] <%秒>)[ \ W \ W] に([\ W \ W])」とグループ1 +モード+グループ2と

+0

ありがとう、それは私に必要なヒントを与えた。 –

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) 
+0

それは私がやったことです。 –

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のようなライブラリを使うことは、正規表現に一緒にパッチを当てようとするよりはるかに優れています。可能であれば、このルートに進むことを強くお勧めします。

+0

、または標準のxmlの場合は、elementTreeのようなXMLライブラリを使用して修正することができます。ここではreg exを実際に使用することはできません。 –

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に、すべてのモードの要素を変更します:

その後、これらの二つのグループを含め、私は変更する必要があるテキストをブラケット2つのキャプチャグループは、今そこにあるように正規表現を変更
<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> 
関連する問題