1

私は次の形式の文字列を持っています:

"[NUM : NAME : NUM]: [NUM : NAME : NUM]:..."

この文字列からすべてのNAMEを抽出できるようにしたいと思います。NAMEには、アルファベットから句読記号や数字まで、任意の文字を使用できます。NUMは[0-9]+の形式のみです

このコマンドを発行してみました:

re.findall(r"\[[0-9]+\:([.]+)\:[0-9]+\]", string)

しかし、私が要求したものを与える代わりに、いくつかの[NUM:NAME:NUM]を[。] +グループにまとめます。これは、この正規表現に関しても正しいですが、私が必要とするものではありません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

これを試して:

re.findall(r"\[[0-9]+\:(.+?)\:[0-9]+\]", string)

?後に追加するの+は欲張りではありません。貪欲とは、+一致している間にできるだけ多くの文字を使用することを意味し、デフォルトでは貪欲です。追加する?ことで、貪欲ではないことを伝えます。つまり、+一致する文字の最小数が必要になります。

上記は、num、:、およびnameの間にスペースがない場合に機能します。

スペースがある場合は、次を使用します。

re.findall(r"\[[0-9]+ \: (.+?) \: [0-9]+\]", string)
于 2013-01-18T17:04:43.123 に答える
1
  • 最初の問題は.、文字クラス内に囲まれていることです。したがって、あなたはの意味を失い、.それはただのに一致するだけ dot(.)です。

  • 次に、文字列内の数字の後のスペースを考慮していません。

  • 第三に、あなたはあなた.+を中心にしたがらない数量詞を使う必要があります。したがって、-([.]+)を。に置き換え(.+?)ます。

  • 第四に、あなたはあなたのを逃れる必要はありませんcolons (:)

あなたはこれを試すことができます:-

>>> re.findall(r'\[[0-9]+[ ]*:(.+?):[ ]*[0-9]+\]', string)
6: [' NAME ', ' NAME ']
于 2013-01-18T17:03:34.307 に答える