、それは速いですし、完全なexctractionを容易に可能である:
import re
ss = '''a line
another line
<address>
Some street address<br />City, State and ZIP<br />
<div class="phone">
(123) 456-7890
</div>
<glomo>
Hello glomo
</glomo>
</address>
end of text'''
def analyze(ss,tag,regx = re.compile('<([^ ]+)([^>]*)>(.*?)</\\1>',re.DOTALL)):
extract = re.search('<(%s)[^>]*>(.*?)</\\1>' % tag,ss,re.DOTALL).group(2)
li = []
def trt(m):
li.append((m.group(1),m.group(2),m.group(3).strip(' \t\r\n')))
li.append(('','',regx.sub(trt,extract).strip('\r\n\t ')))
return li
resu = analyze(ss,'address')
for el in resu:
print el
print
print resu[-1][2]
結果
('div', ' class="phone"', '(123) 456-7890')
('glomo', '', 'Hello glomo')
('', '', 'Some street address<br />City, State and ZIP<br />')
Some street address<br />City, State and ZIP<br />
または辞書で結果をputing:
def analyze(ss,tag,regx = re.compile('<([^ ]+)([^>]*)>(.*?)</\\1>',re.DOTALL)):
extract = re.search('<(%s)[^>]*>(.*?)</\\1>' % tag,ss,re.DOTALL).group(2)
di = {}
def trt(m):
di[m.group(1)] = (m.group(2),m.group(3).strip(' \t\r\n'))
di[''] = ('',regx.sub(trt,extract).strip('\r\n\t '))
return di
disu = analyze(ss,'address')
print "disu[''] ==",disu['']
print "disu['div'] ==",disu['div']
print (disu[x][1] for x in disu if 'phone' in disu[x][0]).next()
結果
disu[''] == ('', 'Some street address<br />City, State and ZIP<br />')
disu['div'] == (' class="phone"', '(123) 456-7890')
(123) 456-7890
関数は何も返しません(または代わりにNoneを返します)。regx.sub(trt,extract)
は、抽出語のfounsタグを""
に置き換えます。検査されたタグのテキストのみに残ります。
恐ろしい - 「テキストの最初の行をつかむ」より魔法のような方法がないと、私はこれをもって過渡的に行くだろうと思う。 :) – binarysolo