0

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

解析中に文字列を分割する際に矛盾があるのはなぜですか?私は両方の場所で同じコードを使用しています。

誰かが私がこれが起こっている理由を理解するのを手伝ってもらえますか?:)

4

1 に答える 1

2

代わりにブール演算子|を使用する必要がある場合に、バイナリビット単位または演算子を使用しています。or

elif (c==7|c==3):

する必要があります

elif c==7 or c==3:

多分:

elif c in (3, 7):

起動が速くなります。

演算子の優先順位は演算子と|異なるため、最初のステートメントはビット単位の論理演算を実行する場合とor解釈され、との両方に等しくなることはない結果を返します。したがって、常に次の値が返されます。(c == (7 | c) == 3)7 | cc3False

>>> c = 7
>>> (c==7|c==3)
False
>>> c = 3
>>> (c==7|c==3)
False
>>> c==7 or c==3
True
于 2013-03-14T10:01:16.607 に答える