如何为 Pandas RE .str.extract() 使用 RE OR Operand

Posted

技术标签:

【中文标题】如何为 Pandas RE .str.extract() 使用 RE OR Operand【英文标题】:How to use RE OR Operand for Pandas RE .str.extract() 【发布时间】:2018-08-21 14:15:50 【问题描述】:

我是新手,我确信这在我的代码中很愚蠢。在我的辩护中,我尝试在询问和搜索之前重新阅读 Python RE 文档 here,但到目前为止没有看到重复的问题(这让我感到惊讶。)

在 DataFrame 之外,我在这里有我正在工作的示例:

x = 'my best friend's birthday is 24 Jan 2001.'
print(re.findall('\d1,2\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d2,4', x))
<Anaconda console returns:> 24 Jan 2001

但在我的 Dataframe (df1) 中,我有以下内容:

index     text
0         My birthday is 2/21/19
1         Your birthday is 4/1/20
2         my best friend's birthday is 24 Jan 2001.   

当我运行以下代码时:

df1['dates'] = df1['text'].str.extract('.*?(\d+[/-]\d+[/-]?\d*).*?|\d1,2\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d+')
print('df1['dates'])

我得到以下结果:

     dates
0    2/21/19
1    4/1/20
2    NaN

我尝试过使用括号,重新阅读文档以及其他一些导致无穷无尽的错误的调整。我确定这是一个明显的错误,但我没有看到。有人可以帮忙吗?谢谢。

【问题讨论】:

【参考方案1】:

在 pandas 中使用 .extract() 时必须有一个捕获组。您在 OR 之前的捕获组 | 正在查找带有斜杠的日期。但是在 OR 之后,你只有一个非捕获组。

这里我在整个搜索模式周围放置了一个捕获,并且OR的每一边也有一个非捕获组。

import pandas as pd

df = pd.DataFrame('text': ['My birthday is 2/21/19', 
    'Your birthday is 4/1/20', 
    'my best friend\'s birthday is 24 Jan 2001.'])

df.text.str.extract(
    r'((:?\d+[/-]\d+[/-]?\d*)|' + 
    r'(:?\d1,2\s(:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s\d+))', 
    expand=False)[0]

# returns:
0        2/21/19
1         4/1/20
2    24 Jan 2001

【讨论】:

James,我在摘录的第一个 re 语句中为您的代码添加了一个右括号,以使其按预期工作。您的回答对我帮助很大,谢谢:r'((:?(\d+[/-]\d+[/-]?\d*))|' +

以上是关于如何为 Pandas RE .str.extract() 使用 RE OR Operand的主要内容,如果未能解决你的问题,请参考以下文章

如何为 pandas 数据框中的不同组分配唯一 ID?

如何为 sklearn 聚类算法准备 pandas 字符串数据表?

如何为 Keras 计算 Pandas DataFrame 的类权重?

如何为Keras计算Pandas DataFrame的类权重?

如何为 Pandas pd.read_csv 设置代理

如何为来自同一个熊猫数据框的所有不同列制作单独的 Seaborn kde 图?