在 df 列上迭代不同的正则表达式模式

Posted

技术标签:

【中文标题】在 df 列上迭代不同的正则表达式模式【英文标题】:Iterate different Regular Expression Patterns over df Column 【发布时间】:2018-08-17 11:50:43 【问题描述】:

我有一个 df 列,其中包含文本,我正在尝试从中提取不同的日期模式。

这个df1 例如:

<index>    text    
0          My birthday is 10/23/89.
1          Christmas is on December 25th.
2          Thanksgiving of 11/2008 was the best.

所需的输出是第三列,称为dates

<index>    text                                  dates
0          My birthday is 10/23/89.               10/23/89
1          Christmas is on December 25.           25 December
2          Thanksgiving of 11/2008 was the best.  11/2008

为了拉出我们的第一次约会,我写了我的第一个 re 表达式,像这样:

df1['dates'] = (df1['text'].str.findall(r'\d1,2[/-]\d1,2[/-]\d2 ,4'))

这就是我卡住的地方。

我不知道/不明白如何编写多个 re 表达式,而不是继续写 df1['dates'] 列中已有的内容。

我想运行下一个表达式:

df1['dates'] = df1['text'].str.findall(r'(?:\d1,2)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d1,2, )?\d4')

如何或最好的方法是查看df['dates'] 列是否为空,然后尝试下一个 re 表达式?

我今天早些时候问过这个问题,它被标记为可能与 this 重复,但我认为 DeepSpace 认为我比实际聪明得多,我的问题比他回答的问题更基本。

【问题讨论】:

【参考方案1】:

你可以试试

df['dates'] = df['text'].str.extract('.*?(\d+/\d+/?\d*).*?')


    text                                    dates
0   My birthday is 10/23/89.                10/23/89
1   Christmas is 12/25.                     12/25
2   Thanksgiving of 11/2008 was the best.   11/2008

添加测试用例:

df['text'].str.extract('.*?(\d+/\d+/?\d*).*?|\
(January|February|March|April|May|June|July|August|September|October|November|December \d+)', expand = False)\
.fillna('').sum(1)

然后你得到

0       10/23/89
1    December 25
2        11/2008

【讨论】:

@Vaishiali 谢谢 - 这个表达式有帮助,但是真实的数据集也有一些月份,比如 'Oct'、'October' 所以真正的结果集并不是所有的数字。因此,我认为我仍然需要遍历数据集或获取 '|'运算符对我的数据使用多个正则表达式。 为了清楚起见更新了问题,并在我的数据中包含了一个文本月份以避免混淆。再次感谢您帮助我。 @SDS,很难为这种情况编写精确的正则表达式,但无论如何我已经更新了我的答案。在这里,我试图找到两种模式,数字格式的日期或月份名称格式,并使用轴 1 上的 sum 将两者结合起来

以上是关于在 df 列上迭代不同的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章

在多列上迭代和应用正则表达式函数/str 计数

Pandas - 使用模式/正则表达式编辑索引

是否有 Python 的 re.findall/re.finditer(迭代正则表达式结果)的 Perl 等价物?

应用逻辑后,正则表达式模式在 pyspark 中不起作用

删除所有满足正则表达式条件的行

ES2018 新特征之:正则表达式 dotAll 模式