Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按字符串字段中的数字字符对行进行分组?_Python_Mysql_Sql_Regex - Fatal编程技术网

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

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

我有一些非常丑陋的数据,我正试图按摩。它由SKU组成,我想将它们分组到产品线中。例如:

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表示完全不直观但有效的解决方案。