0

私はまだREGEXを学んでいますが、問題に遭遇しました...

10 進形式の文字と数字の混合で構成される文字列を分離しようとしています。

AB0.500CD1.05EF2.29

このようなものに:

list1 = AB、CD、EF

list2 = 0.500,1.05,2.29

これらすべての複雑な点は、次のような文字列もあるということです。

AB1CD2EF3

これも次のように分けたいと思います。

list1 = AB、CD、EF

list2 = 1,2,3

以前の調査では、次のスニペットが得られました。

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+)')
for (letters, numbers) in re.findall(pattern,cmpnd):
    print numbers
    print letters

この例は、第 2 種の文字列に対してはうまく機能しますが、第 1 種の文字列の小数点以下の桁数を含む数値の先頭の数字のみを「検索」します。

次の行を使用してアプローチを試みました。

pattern = re.compile(r'([a-zA-Z]+)([0-9]+(\.[0-9]))')

しかし、これはエラーになります: "ValueError: unpack する値が多すぎます"

あらゆる支援に感謝します!

4

3 に答える 3

2

エラー

ValueError: too many values to unpack

正規表現に新しい一致グループを追加したため、生成されます

([a-zA-Z]+)([0-9]+(\.[0-9]))
                --^^^^^^^^^--

割り当ての数 (つまり、2 つの割り当て) の不一致につながる

for (letters, numbers) in re.findall(pattern,cmpnd):
  --^^^^^^^^^^^^^^^^^^--

および各グループの正規表現によって返される一致の数 (つまり、3 つの一致)

for (letters, numbers) in re.findall(pattern,cmpnd):
                        --^^^^^^^^^^^^^^^^^^^^^^^^^--

これらは、解凍を更新することで簡単に修正できます

for (letters, numbers, _) in re.findall(pattern, cmpnd):

しかし、まだ問題があります。正規表現は、小数部分のない数値を受け入れません。オプションの小数部分の一致グループを実行して、正規表現を拡張できます。

([a-zA-Z]+)([0-9]+(\.[0-9])?)
                         --^--

この時点で、コードは次のようになります。

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+(\.[0-9])?)')
for (letters, numbers, _) in re.findall(pattern, text):
  print letters, numbers

改良点

3 番目に一致するグループは、別のより大きなグループに含まれているため、使用されていません。したがって、このグループを一致しないグループにすることができます(?:\.[0-9])?)

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9]+(?:\.[0-9])?)')
for (letters, numbers) in re.findall(pattern, text):
  print letters, numbers

また、数値形式の強制的な検証が必要ない場合は、単純化できます。つまり、任意の順序で連続する数字とピリオドで構成される文字列を数値として受け入れます[0-9.]+

import re
pattern = re.compile(r'([a-zA-Z]+)([0-9.]+)')
for (letters, numbers, _) in re.findall(pattern, text):
  print letters, numbers
于 2012-10-20T22:54:33.750 に答える
2

数字を含む文字クラスにドットを追加するだけです。

pattern = re.compile(r'([a-zA-Z]+)([0-9.]+)')
于 2012-10-20T22:29:03.770 に答える
0

このパターンを試して、

[A-Z]{2}(\d+(\.(\d)+)?)

また

[A-Z]+(\d+(\.(\d)+)?)
于 2012-10-20T22:27:48.603 に答える