在 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 列上迭代不同的正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章