1

靴の識別子(SKU)の靴のサイズに一致する小さなスクリプトを作成しています。

私が処理できるようにしたいいくつかのケースがあります。次のリストがあるとします。

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']

しかし、ご覧のとおり、機能しません。小数点の前と後の数字だけを一致させたいのですが、数字だけを一致させたいのです。

4

2 に答える 2

3

いくつかの問題:

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

これを試して:

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

一部の文字列にはアンダースコアが含まれているか、小数点が含まれていないことに注意してください。これらのケースで何が起こるかを実際に説明しておらず、このパターンで例のすべてのケースを処理できるわけではありませんが、良いスタートを切ることができれば幸いです。

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

于 2012-05-11T19:45:33.493 に答える
0

探しているのは、スペースまたはアンダースコアに続く数字(数字、小数点、およびそれ以上の数字)の最初の出現であるように思われます。

それで

r'[ _](\d+(?:\.\d+)?)'
于 2012-05-11T21:01:46.383 に答える