0

したがって、Python が基本的に次のような文字列の違いを検出する方法が必要です。

W:1.0,X:1.1(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8)Y:0.9

この:

A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8

最初の文字列では、互いに続く 2 つの内括弧があり、2 番目の文字列では、最初の内括弧の後に閉じ括弧が続くことを検出するために使用できる関数はありますか? .re 正規表現でない方がよいでしょう。ありがとう!

編集:私は括弧のすべてのケースを扱っています:

A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8,(T:0.6,V:0.7)S:0.8,(D:0.6,Y:0.7)P:0.8,(X:0.6,L:0.7)M:0.8

内側の 2 つの子文字列の任意の無限の量...

W:1.0,X:1.1(U:5.0(I:9.0)N:8.0,(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8)R:3.4(O:5.5)P:3.0)Y:0.9

独自の子を持つ無限の数の子を含むことができる、非常に複雑な複数の子フィールドを持つ文字列

4

5 に答える 5

2
s = 'W:1.0,X:1.1(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8)Y:0.9'

def max_depth(s, start_ch='(', end_ch=')'):
    depth = 0
    best = 0
    for ch in s:
        if ch == start_ch:
            depth += 1
            best = max(depth, best)
        elif ch == end_ch:
            depth -= 1
            if depth < 0:
                raise ValueError('illegal string - unmatched close-paren')
    if depth:
        raise ValueError('illegal string - unmatched open-paren')
    return best

print max_depth(s)    # => 2
于 2012-07-09T16:32:52.063 に答える
1

これは厄介なnumpyアプローチです。基本的には astay13 の提案と同じですが、大規模なデータセットでは高速になるはずです。データが大きすぎてメモリが不足する場合は、チャンクで処理する必要があります。

>>> import numpy as np
>>> a = 'W:1.0,X:1.1(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,(F:0.6,G:0.7)H:0.8)Y:0.9'
>>> arr = np.fromstring(a, dtype=np.ubyte)
>>> parens = (arr==ord('(')).astype(int) - (arr==ord(')')) ## search for parens

>>> parens   ## 1 marks location of opening paren, -1 marks closing paren
array([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0, -1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0, -1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0])

>>> parens[1:] += parens[:-1]  ## compute the nesting level at each character position
>>> parens   
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])
于 2012-07-09T16:00:03.610 に答える
1

文字列を 1 文字ずつ調べて、開始括弧と終了括弧の数を数えることができます。

ティムがコメントで指摘したように、開始括弧よりも終了括弧の方が多い場合を識別するロジックが必要です。

于 2012-07-09T15:16:43.363 に答える
0

行にネストされた括弧がないことを確認するには(質問の例2、3):

re.match(r'(?: [^)]  |  \( [^)]* \) )*$', line, re.X)

つまり、行は、0回以上繰り返される括弧内の非括弧文字またはネストされていない式です。

于 2012-07-09T15:58:37.747 に答える
0

正規表現は、これを行うためのよりエレガントな方法です。次のように簡単にできます。re.search(r'\(.*?\(.*?\)', string)これにより、文字列の閉じ括弧の前に 2 つの開き括弧がある場合に通知されます。

これらを使用したくない場合は、文字列内の文字を反復処理できます。閉じ括弧のない 2 つの開き括弧に遭遇した場合は、それを処理します。

于 2012-07-09T15:20:27.090 に答える