2012-05-11 179 views
1

我正在写一个小脚本,它将匹配鞋号(SKU)中的鞋号。Python正则表达式匹配鞋号

有几个我希望能够处理的情况。鉴于以下列表:

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

但你可以看到它不工作上来。我想只能匹配小数点前和小数点后的数字,但只能匹配数字。

+1

应该鞋码是什么''317982-019''? –

+0

它应该忽略(不匹配)没有大小的skus – Paulo

+1

要得到一个很好的答案,你应该告诉_us_如何识别鞋子的尺寸。请给出一个带有样本输入和*正确*(预期)结果的表格。 – alexis

回答

3

的几个问题:

  • .在正则表达式的特殊含义。如果你真的想匹配一个点,你需要逃避它。
  • 您可能希望点是可选的。
  • 使用诸如\D,\b(?!\d)等技术检查比赛前后是否有更多数字。
  • 您通常应该使用原始字符串来编写正则表达式模式,以便反斜杠序列不会被解释为控制字符。
  • re.findall找到多个匹配项。如果您知道只有一场比赛,请使用re.search

试试这个:

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

请注意,您的一些字符串包含下划线或无小数点分隔符。你没有真正描述在这些情况下应该发生什么,这种模式不会处理你的例子中的所有情况,但它有望给你一个好的开始。

您可能还想考虑为每种输入类型编写不同的正则表达式,而不是尝试编写单个正则表达式来处理所有可能的输入。

+0

谢谢,我会更新我的问题。你的回答非常有帮助,非常感谢:) – Paulo

0

看起来你正在寻找的是一个数字(数字,小数点和更多数字)后面的空格或下划线的第一次出现。

所以

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