Python 如何按字符串字段中的数字字符对行进行分组?
我有一些非常丑陋的数据,我正试图按摩。它由SKU组成,我想将它们分组到产品线中。例如:Python 如何按字符串字段中的数字字符对行进行分组?,python,mysql,sql,regex,Python,Mysql,Sql,Regex,我有一些非常丑陋的数据,我正试图按摩。它由SKU组成,我想将它们分组到产品线中。例如: PRODUCT_ID ---------- 313L30WHITE 313L40WHITE 313L30BLACK 3333 2L10RED 2L20BLACK 32341/30/BLK 基本上,我想按照PRODUCT\u ID字段中的第一个数字字符对项目进行分组。即,第一个非数字字符之前的所有字符。例如: PRODUCT_ID GROUP ---------- ----- 313L30WHIT
PRODUCT_ID
----------
313L30WHITE
313L40WHITE
313L30BLACK
3333
2L10RED
2L20BLACK
32341/30/BLK
基本上,我想按照PRODUCT\u ID
字段中的第一个数字字符对项目进行分组。即,第一个非数字字符之前的所有字符。例如:
PRODUCT_ID GROUP
---------- -----
313L30WHITE 313
313L40WHITE 313
313L30BLACK 313
3333 3333
2L10RED 2
2L20BLACK 2
32341/30/BLK 32341
似乎SQL解决方案并不优雅。因此,我更喜欢使用Python解决方案,该解决方案使用新的GROUP
列创建一个新表
有人有什么建议吗 这是正则表达式的完美地方
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())
尽管可能有一种更有效的方法来实现这一点。如果您知道
PRODUCT\u ID
总是以一个或多个数字字符开头,那么您可以通过添加0
将其转换为数字:
select PRODUCT_ID,
0 + PRODUCT_ID as GROUP
from ...
看
如果希望GROUP
为文本而不是数字,则可以编写:
select PRODUCT_ID,
concat(0 + PRODUCT_ID) as GROUP
from ...
在我看来,在mysql中解决这个问题是相当不干净的。但是这里有人问了一个关于在mysql查询中从字符串中提取数字的更一般问题:在看了这个答案之后,我同意SQL解决方案不会很优雅。修改后的问题。赫密士:“甜蜜型木星胁迫!”+1表示完全不直观但有效的解决方案。