2009-05-02 15 views
2

私は、配列内の各文字列はこのような何かを探してPythonで文字列の配列を持っている:私はしばらく探していると私は見つけることができる最善のことをしようとしているPythonの正規表現の構文解析

<r n="Foo Bar" t="5" s="10" l="25"/> 

HTMLハイパーリンクの正規表現を私のニーズに合うものに修正してください。

しかし、私はhaventの正規表現のものは実際にはまだ動作していませんでした。これは私がこれまで持っていたものです。

string = '<r n="Foo Bar" t="5" s="10" l="25"/>' 
print re.split("<r\s+n=(?:\"(^\"]+)\").*?/>", string) 

その文字列からn、t、s、lの値を抽出するにはどうすればよいでしょうか?

答えて

7

これは、あなたが道のほとんどを取得します:

>>> print re.findall(r'(\w+)="(.*?)"', string) 
[('n', 'Foo Bar'), ('t', '5'), ('s', '10'), ('l', '25')] 

re.splitre.findallは相補的です。

思考プロセスが「Xのように見える各アイテムを必要とする」と開始するたびに、re.findallを使用する必要があります。 「各Xの間でデータを囲みたい」と始めると、re.splitを使用します。

+0

、完璧に感謝を働きました。 – AdamB

6
ソースはXMLのように見えるので、それは、正確にBeautifulSoup(というか、 BeautifulSoup.BeautifulStoneSoupモジュール)XMLではない場合は、「最良の方法は、」.. XML解析モジュールを使用するだろうと
<r n="Foo Bar" t="5" s="10" l="25"/> 

かもしれませんそれは(「ないかなり XMLある」ということや、物事)おそらく、無効なXMLを扱うのが得意だとして、最高の仕事:

>>> from BeautifulSoup import BeautifulStoneSoup 
>>> soup = BeautifulStoneSoup("""<r n="Foo Bar" t="5" s="10" l="25"/>""") 

# grab the "r" element (You could also use soup.findAll("r") if there are multiple 
>>> soup.find("r") 
<r n="Foo Bar" t="5" s="10" l="25"></r> 

# get a specific attribute 
>>> soup.find("r")['n'] 
u'Foo Bar' 
>>> soup.find("r")['t'] 
u'5' 

# Get all attributes, or turn them into a regular dictionary 
>>> soup.find("r").attrs 
[(u'n', u'Foo Bar'), (u't', u'5'), (u's', u'10'), (u'l', u'25')] 
>>> dict(soup.find("r").attrs) 
{u's': u'10', u'l': u'25', u't': u'5', u'n': u'Foo Bar'}