如何按字符串字段中的数字字符对行进行分组?

时间:2012-04-02 00:19:02

标签: python mysql sql regex

我想要按摩一些非常难看的数据。它由SKU组成,我想将它们分组到产品线中。 E.g:

PRODUCT_ID
----------
313L30WHITE
313L40WHITE
313L30BLACK
3333
2L10RED
2L20BLACK
32341/30/BLK

基本上,我想按PRODUCT_ID字段中的第一个数字字符对项目进行分组。即,所有字符直到第一个非数字字符。 E.g:

PRODUCT_ID    GROUP
----------    -----
313L30WHITE   313
313L40WHITE   313
313L30BLACK   313
3333          3333
2L10RED       2
2L20BLACK     2
32341/30/BLK  32341

似乎SQL解决方案不会优雅。因此,我更喜欢使用新的GROUP列创建新表的Python解决方案。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果您知道PRODUCT_ID将始终开始并带有一个或多个数字字符,那么您只需添加0即可将其转换为数字:

select PRODUCT_ID,
       0 + PRODUCT_ID as GROUP
  from ...

请参阅§11.2 "Type Conversion in Expression Evaluation" in the MySQL 5.6 Reference Manual

如果您希望GROUP是文本而不是数字,那么您可以写:

select PRODUCT_ID,
       concat(0 + PRODUCT_ID) as GROUP
  from ...

答案 1 :(得分:2)

这是正则表达式的理想场所......

import re
RE=re.compile(r'\d+')
#Set up the list of SKU's
...
List_of_SKUs.sort(key=lambda x:int(RE.match(x).group()))

现在您的列表已排序。

正则表达式只是拉出字符串开头的最长整数。 lambda函数只访问字符串的那一部分并将其强制转换为用于排序的整数。

修改

从那里,如果你想打印表格,你可以做类似的事情:

for item in List_of_SKUs:
    print "%s\t%s"%(item,RE.match(item).group())

虽然可能有更有效的方法。