regexp正则提取+wraprows数组重构,从混乱文本到结构化表格转换
我们继续上一篇文章,提供一种新的解题思路。
还用昨天文章中案例的数据源:
由于微信中的信息是一连串的文本字符,那么当我们复制粘贴到Excel表格中的时候,肯定会放置到一个单元格中显示,比如A1单元格的数据就是我们复制粘贴过来的。
数据的格式是:“名称与数量,名称与数量......”,即若干个“名称与数量”以逗号为分隔符连接在一起了。且“名称与数量”之间没有明显的分隔符。
我们要将其整理到C2:D12区域,即一列名称,一列数量,每行为一组对应的数据。
根据数据源的实际情况,下面是公式整体结构:
=WRAPROWS(REGEXP(A1,"\p{Han}+|\d+"),2)
核心逻辑:
先提取文本中的汉字和数字,再将结果按两列重组。
下面是分步拆解说明。
第一步:正则提取
输入函数:
=REGEXP(A1,"\p{han}+")
正则表达式
\p{Han}+:作用是匹配连续的中文字符。比如从“白菜400”中提取“白菜”。
得到一整行的数组溢出结果:
{"白菜","头菜","萝卜","白萝卜","土豆","土胡萝卜","净胡萝卜","茭瓜","茄子","茄王"}
各个提取到的蔬菜名称分布在一行不同单元格中。
继续完善正则表达式:
=REGEXP(A1,"\p{han}+\d+")
正则表达式:
\d+:作用是匹配连续的数字。比如从“白菜400”中提取“400”。
此时由于和\p{han}+组合使用,提取到的是蔬菜与数量的结合体。
各个提取到的蔬菜+数量分布在一行不同单元格中:
{"白菜400","头菜3","萝卜3","白萝卜2","土豆3","土胡萝卜2","净胡萝卜1","茭瓜2","茄子1","茄王1"}
继续完善正则表达式:
=REGEXP(A1,"\p{han}+|\d+")
|:逻辑“或”符号。
将“|”放置到“\p{han}+”与“\d+”之间:
可以交替匹配汉字和数字,也可以同时自动跳过其他字符,如中文逗号、空格等。
这样蔬菜名称、数量会全部分布在一行不同单元格中:
{"白菜","400","头菜","3","萝卜","3","白萝卜","2","土豆","3","土胡萝卜","2","净胡萝卜","1","茭瓜","2","茄子","1","茄王","1"}
有网友反馈诉求,如果数量含有小数咋办?
由于本例中为蔬菜数量,从原则上讲,不会出现小数。但我们假设存在小数,给出他解决方案:
=REGEXP(A1,"\p{han}+|\d+\.\d+|\d+")
\d+\.\d+:表示小数模式
\d+:表示整数模式
\d+\.\d+|\d+:表示小数或整数
\p{han}+|\d+\.\d+|\d+:表示汉字或小数或整数
第二步:数组重组
WRAPROWS函数用于将向量数据按指定的列数重新排列,构建新数组。
WRAPROWS函数结构:
=WRAPROWS(数组, 列数)
输入公式:
=WRAPROWS(REGEXP(A1,"\p{han}+|\d+"),2)
将REGEXP函数提取的线性数组,按行优先顺序转换为2列。最终就是每行放置2个元素,形成“名称+数量”结构。
重组逻辑:
将线性数组转换为一维表格:
总结流程:
文本清洗:通过正则提取关键信息,剔除干扰符号。
结构重组:将线性数据转换为一维表格,适配Excel单元格布局。
此公式通过精准的正则匹配和数组重组,实现了从混乱文本到结构化表格的高效转换。