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

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相关问答推荐

如何为 ManyToMany 字段添加排序?

如何将对称矩阵转换为邻接表

根据 Pandas Groupby 中的组合标准添加新列

从 2D numpy 数组中提取多组行/列

当你的模型不能过拟合一小批数据时,这意味着什么?

Pandas Mapping:基于树形结构添加后缀

Pandas df 按计数元素分组

如何创建字典来查找丢弃的零?

在python中循环遍历图像中每个像素的更快方法?

如何从多个数据帧创建分层多索引数据帧?

如何编写python re.sub模式忽略单引号或双引号?

将 (x,y) 坐标列表设置为数组,以便绘制多边形

从 python `dataclass` `__repr__` 中排除默认字段

如何在python中获得列表的向前移动组合?

如何复制 pandas DataFrame 行并定期更改一列

与 API Gateway 相比,AWS Lambda 函数 URL 返回不同的内容长度值

使用 BeautifulSoup 抓取 URL 循环

读取文件并打印前两行和后两行的脚本

在numpy diff中减去第一个和最后一个元素(环绕)

python:比较字典以在缺少项目时返回 keyError