Pythonで文字列を解析しようとしています。私はスタックオーバーフローについていくつかの質問を投稿しました、そして私は基本的に私が扱っている文字列を解析するすべての異なる可能な方法の機能を組み合わせようとしていました。
これは、次の2つの文字列形式を解析するために単独で正常に機能するコードスニペットです。
from __future__ import generators
from pprint import pprint
s2="<one><two><three> an.attribute ::"
s1="< one > < two > < three > here's one attribute < six : 10.3 > < seven : 8.5 > < eight : 90.1 > < nine : 8.7 >"
def parse(s):
for t in s.split('<'):
for u in t.strip().split('>',1):
if u.strip(): yield u.strip()
pprint(list(parse(s1)))
pprint(list(parse(s2)))
これが私が得た出力です。これは、各属性が異なるインデックスの場所に格納される必要がある形式です。
['one',
'two',
'three',
"here's one attribute",
'six : 10.3',
'seven : 8.5',
'eight : 90.1',
'nine : 8.7']
['one', 'two', 'three', 'an.attribute ::']
その後、同じコードを4つの文字列形式を解析できる関数に組み込んでみましたが、どういうわけかここではうまくいかないようで、理由がわかりません。
組み込まれたコード全体を次に示します。
from __future__ import generators
import re
import string
from pprint import pprint
temp=[]
y=[]
s2="< one > < two > < three > an.attribute ::"
s1="< one > < two > < three > here's an attribute < four : 6.5 > < five : 7.5 > < six : 8.5 > < seven : 9.5 >"
t2="< one > < two > < three > < four : 220.0 > < five : 6.5 > < six : 7.5 > < seven : 8.5 > < eight : 9.5 > < nine : 6 - 7 >"
t3="One : two : three : four Value : five Value : six Value : seven Value : eight Value :"
def parse(s):
c=s.count('<')
print c
if c==9:
res = re.findall('< (.*?) >', s)
return res
elif (c==7|c==3):
temp=parsing(s)
pprint(list(temp))
#pprint(list(parsing(s)))
else:
res=s.split(' : ')
res = [item.strip() for item in s.split(':')]
return res
def parsing(s):
for t in s.split(' < '):
for u in t.strip().split('>',1):
if u.strip(): yield u.strip()
pprint(list((s)))
コードをコンパイルして呼び出すparse(s1)
と、出力として次のようになります。
7
["< one > < two > < three > here's an attribute < four",
'6.5 > < five',
'7.5 > < six',
'8.5 > < seven',
同様に、を呼び出すとparse(s2)
、次のようになります。
3
['< one > < two > < three > an.attribute', '', '']
'9.5 >']
解析中に文字列を分割する際に矛盾があるのはなぜですか?私は両方の場所で同じコードを使用しています。
誰かが私がこれが起こっている理由を理解するのを手伝ってもらえますか?:)