我有一个这样的正则表达式,可以从列中提取订单号:

df["Orders"].str.extract('([0-9]{9,10}[/+ #_;.-]?)')

"订单"列可以如下所示:

12
123456789
1234567890
123456789/1234567890
123456789/1/123456789
123456789+1234567890

在正则表达式之后的dataframe中生成的新列应该如下所示:

NaN
123456789
1234567890
123456789/1234567890
123456789/123456789
123456789+1234567890

然而,使用我目前的正则表达式,我得到了以下结果:

NaN
123456789
1234567890
123456789/
123456789/
123456789+

我怎样才能得到我想要的结果?

推荐答案

你可以用

import pandas as pd
df = pd.DataFrame({'Orders':['12','123456789','1234567890','123456789/1234567890','123456789/1/123456789','123456789+1234567890', 'Order number: 6508955960_000010_1005500']})
df["Result"] = df["Orders"].str.findall(r'[/+ #_;.-]?(?<![0-9])[0-9]{9,10}(?![0-9])').str.join('').str.lstrip('/+ #_;.-')
df.loc[df['Result'] == '', 'Result'] = np.nan

regex demo.Details

  • [/+ #_;.-]?(?<![0-9])[0-9]{9,10}(?![0-9])-匹配可选的/+、空格、#_;.-个字符,然后匹配无或不包含其他数字的十位数
  • Series.str.findall提取所有事件
  • .str.join('')将匹配项连接成单个字符串
  • .str.lstrip('/+ #_;.-')-删除与字符串开头的数字匹配的特殊字符
  • df.loc[df['Result'] == '', 'Result'] = np.nan-如果需要-用Result列中的np.nan个值替换空字符串.

输出:

>>> df
                  Orders                Result
0                    NaN                   NaN
1              123456789             123456789
2             1234567890            1234567890
3   123456789/1234567890  123456789/1234567890
4  123456789/1/123456789   123456789/123456789
5   123456789+1234567890  123456789+1234567890
>>> 

Python相关问答推荐

如何在海上配对图中使某些标记周围的黑色边框

语法错误:文档. evaluate:表达式不是合法表达式

使用SeleniumBase保存和加载Cookie时出现问题

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

查找查找表中存在的列值组合

Django抛出重复的键值违反唯一约束错误

在不降低分辨率的情况下绘制一组数据点的最外轮廓

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";

具有数值数组问题的递归矩阵构造(广播?)

在极坐标中添加列总计行

极点在没有Groupby的情况下聚合

在使用TO_EXCEL时如何为正数加上加号?

抽象工厂模式与委托者模式组合时出现递归错误

两极中的`df.Query()`?

PySpark:使用重置对窗口进行计数

在POLARS中,如何命名使用GROUP_BY和N_UNIQUE创建的列?

在Pandas 中通过GroupBy操作创建新列时出现KeyError

如何根据预定义的模板重新排序YAML键并维护注释?

用于判断x=()的&Quot;isInstance()和Not&Quot;vs&Quot;==&Quot;

如何使用Python模式匹配来匹配类类型?