0

ファイルでは、次の2つの文字列形式のいずれかを使用できます。

::WORD1::WORD2= ANYTHING
::WORD3::WORD4::WORD5= ANYTHING2

これは私が思いついた正規表現です:

::(\w+)(?:::(\w+))?::(\w+)=(.*)

regex.findall(..)

[(u'WORD1', u'', u'WORD2', u' ANYTHING'),
 (u'WORD3', u'WORD4', u'WORD5', u' ANYTHING2')]

u''私の最初の質問は、最初の文字列を照合するときになぜこれが空になるのかということです。

私の2番目の質問は、この正規表現を書く簡単な方法はありますか?2つの文字列は非常に似ていますが、この余分な文字列がある場合があります::WORD5

私の最後の質問は次のとおりです。ほとんどの場合、私は間に単語しかない::ので、それで\w+十分ですが、時々、2-WORD2などのようなものを手に入れることができます。3-2-WORD2これ-が表示されます。どうすればそれをに追加でき\w+ますか?

4

4 に答える 4

1

キャプチャされたグループはre.findall、何にも一致しない場合でも、常に結果に含まれます。そのため、空の文字列を取得します。区切り文字の間にあるものを取得したいだけの場合は、split代わりに試してくださいfindall

a = '::WORD1::WORD2= ANYTHING'
b = '::WORD3::WORD4::WORD5= ANYTHING2'

print re.split(r'::|= ', a)[1:] # ['WORD1', 'WORD2', 'ANYTHING']
print re.split(r'::|= ', b)[1:] # ['WORD3', 'WORD4', 'WORD5', 'ANYTHING2']

コメントに応えて、「ANYTHING」がうまくいくとしたら、正規表現よりも文字列関数を使用する方が簡単です。

x, y = a.split('= ', 1)
results = x.split('::')[1:] + [y]
于 2013-01-09T10:22:00.447 に答える
1

最後の質問:

[\w\-]+

説明:

\w 任意の単語文字に一致します。

于 2013-01-09T10:27:40.483 に答える
0

あなたの最後の質問のためにあなたは次のようなことをすることができます(文字、数字、そして「-」を受け入れる)

[a-zA-Z0-9\-]+
于 2013-01-09T10:18:45.433 に答える
0

thg435の回答に基づいて、「=」に分割して、まったく同じことを行うことができます。

left,right = a.split('=', 1)
answer = left.split('::')[1:] + [right]
于 2013-01-09T10:48:06.163 に答える