2012-05-11 8 views
1

私は靴のサイズ(SKU)から靴のサイズに一致する小さなスクリプトを書いています。Python Regex with shoe size

私はいくつかのケースがあります。以下のリストが与えられます:

sizes = ['315122-603 10 A', '315122-608_12.0', '317982-019', '364781-019_5.5Y', 'V24088-001_10', '609048-035 8.5', '7-20Spm8231B5 10', 'G17295-001_9.5'] 

私はそれぞれのようなサイズ(10,12,5.5、など)を取得したいと考えています。正規表現の

私の知識は非常に限られて、私はここにあるいくつかのスニペットを探していると、次の

r = '\d{1,2}.\d+' 
for size in sizes: 
    re.findall(r, size) 

['315122', '603'] 
['315122', '608', '12.0'] 
['317982', '019'] 
['364781', '019', '5.5'] 
['24088', '001'] 
['609048', '035', '8.5'] 
['7-20', '8231', '5 10'] 
['17295', '001', '9.5'] 

いますが、それは動作しません見ることができるように思い付いたされています。私は10進数の前と10進数の後の数字だけを一致させたいが、数字だけを一致させたい。

+1

靴のサイズは「317982-019'' 'のために何をすべきですか? –

+0

サイズなしのskusを無視(一致しない)してください – Paulo

+1

良い答えを得るには、靴のサイズを認識する方法を_us_に教えてください。サンプル入力と*正しい*(意図された)結果の表を与えてください。 – alexis

答えて

3

いくつかの問題:

  • .は正規表現で特別な意味を持っています。文字通りドットにマッチさせたい場合は、それをエスケープする必要があります。
  • おそらくドットをオプションにします。
  • \D,\bまたは(?!\d)などの技術を使用して、一致の前後に数字がないことを確認します。
  • 通常、正規表現パターンを書き込むために生の文字列を使用して、バックスラッシュシーケンスが制御文字として解釈されないようにする必要があります。
  • re.findall複数の一致が見つかりました。一致するものが1つしかないことがわかっている場合は、re.searchを使用してください。

この試してみてください:あなたの文字列の一部が、アンダースコア、または全く桁区切り文字が含まれていることを

pattern = r'\D(\d{1,2}(?:\.\d+)?)(?!\d)' 

注意を。あなたは実際にこれらのケースで何が起こるべきか記述しておらず、このパターンはあなたの例のすべてのケースを扱うことはできませんが、うまくいけば良いスタートを与えるでしょう。

入力可能なすべての入力を処理する単一の正規表現を作成するのではなく、各入力タイプごとに異なる正規表現を作成することを検討することもできます。

+0

ありがとう、私は私の質問を更新します。あなたの答えは非常に有用であり、本当に感謝しています:) – Paulo

0

スペースやアンダースコアの後ろに数字(桁、小数点以下の桁)が最初に表示されているようです。

ので

r'[ _](\d+(?:\.\d+)?)'