如何编写Python正则表达式匹配整数与分数以拆分Pandas列文本
解决Pandas文本列拆分问题
问题分析
你的文本行结构包含两种核心模式:开头是整数或分数,中间是物品描述,接着是带$或不带$的数字,部分行末尾还有额外物品。之前的正则错误在于强制捕获三个数字组,但实际每行仅包含两个核心数值(开头的数量、后面的数字),导致匹配失败。
调整后的正则表达式
使用以下正则可匹配所有行的整数、分数及数字:
^(\d+(?:\/\d+)?) \s*(.*?) \s*\$?(\d+)\s*(.*)?$
正则细节解释
(\d+(?:\/\d+)?):捕获开头的数量,支持整数(如2、5)和分数(如9/10),(?:\/\d+)是可选非捕获组,专门匹配分数结构\s*:匹配任意数量的空白字符,兼容不同的空格间距(.*?):非贪婪匹配第一个物品的描述文本(如Table、Chairs)\$?:匹配可选的$符号,适配第一行的$75格式(\d+):捕获后面的数字(如75、875)(.*)?:可选捕获末尾的额外物品(如Teabags、Dishwasher tablets)
Pandas代码示例
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'text': [ '2 Table $75', '5 Chairs 875 Teabags', '9/10 gel 125 Dishwasher tablets' ] }) # 拆分文本到多列 df[['quantity', 'item1', 'number', 'item2']] = df['text'].str.extract(r'^(\d+(?:\/\d+)?) \s*(.*?) \s*\$?(\d+)\s*(.*)?$') print(df)
最终输出结果
| text | quantity | item1 | number | item2 |
|---|---|---|---|---|
| 2 Table $75 | 2 | Table | 75 | |
| 5 Chairs 875 Teabags | 5 | Chairs | 875 | Teabags |
| 9/10 gel 125 Dishwasher tablets | 9/10 | gel | 125 | Dishwasher tablets |
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

