-1

私の最初の問題は、文字列を取り除いてから演算子で分割する必要があることです。

s = " a & b | c & d "
l = map(lambda x : map(lambda x:x.strip() , x.strip().split('&')), s.strip().split('|'))

これは読みにくいので、decorator を使用してこの strip() 前処理を行うことを考えています。

ここに私の現在の解決策がありますが、機能していません!

アップデート:

query_AND =lambda wl:  '.*'+'.*'.join(wl)+'.*'

def d_query_AND(query_split):
    def d_query_AND_f(query_split):
        return query_AND(query_split)
        #return query_spli
    return d_query_AND_f


@d_query_AND
def query_split(p):
    return [v for v in p.split('&')]


print query_split("asd & asdsa & sadsa")
4

1 に答える 1

0

なぜデコレータが必要なのか、完全には理解できません。

これらの式をトークン化する比較的簡単な方法の 1 つは、正規表現を使用することです。

In [12]: re.findall(r'[^|&\s]+|&|[|]', ' a & b | c & d ')
Out[12]: ['a', '&', 'b', '|', 'c', '&', 'd']

In [13]: re.findall(r'[^|&\s]+|&|[|]', 'asdasd&sdasd| asdsa & asdsda')
Out[13]: ['asdasd', '&', 'sdasd', '|', 'asdsa', '&', 'asdsda']

正規表現は、OR-ed された 3 つのコンポーネントで構成されます。

  • [^|&\s]+&|および空白以外の一連の文字に一致します。
  • &一致し&ます。
  • [|]一致し|ます。

演算子をキャプチャする必要がない場合は、正規表現を次のように簡略化できますr'[^|&\s]+'

edit :コメントで暗示しているように、スペースで分割したくない場合は、次のようにします。

In [18]: map(string.strip, re.findall(r'[^|&]+|&|[|]', 'asdasd&sd  asd| asdsa & asdsda'))
Out[18]: ['asdasd', '&', 'sd  asd', '|', 'asdsa', '&', 'asdsda']
于 2012-12-04T08:20:46.703 に答える