首页 > 编程问答 >如何从pandas中的字符串中提取带有变量的正则表达式?

如何从pandas中的字符串中提取带有变量的正则表达式?

时间:2024-07-29 09:17:55浏览次数:8  
标签:python pandas regex variables

我有一个包含文本的数据框列,我想创建一个新列,其中包含带有名称的句子,但没有其他句子。希望最终结果如下所示:

spreadsheet printout with sentence in column A, and sentence with names in column 3

我能够从名称列表中识别包含名称的单元格,但我在提取包含名称的句子的部分上遇到了困难。

import re
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ColumnA': ['Lorum ipsum. This is approved. Lorum Ipsum.', 'Lorum Ipsum. Send the contract to May. Lorum Ipsum.', 'Junk Mail from Brian.']
})


last_names_list = ['May','Brian']

df['last_names'] = ''
for x in last_names_list:
    df['last_names'] = np.where(df['ColumnA'].str.contains(x),x,df['last_names'])

def f(x,y):
    return re.findall(fr'[^.]{x}[^.]',y)

df['col_3'] = df.apply(lambda x: f(x['last_names'],x['ColumnA']), axis=1)

print(df)

当我打印数据帧中,每行具有名称的 df[col_3'] 都会生成一个空列表。

任何帮助表示赞赏。


在尝试从 Pandas 数据帧列中的字符串中使用变量提取正则表达式的代码中出现错误。的 f(x, y) 函数存在问题,因为 [^.] 将匹配除句点以外的任何字符,而需要找到包含名称的整个句子。

以下是对的代码进行修复的方法:

import re
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ColumnA': ['Lorum ipsum. This is approved. Lorum Ipsum.', 'Lorum Ipsum. Send the contract to May. Lorum Ipsum.', 'Junk Mail from Brian.']
})

last_names_list = ['May', 'Brian']

df['last_names'] = ''
for x in last_names_list:
    df['last_names'] = np.where(df['ColumnA'].str.contains(x), x, df['last_names'])

def f(x, y):
    for name in last_names_list:
        match = re.search(fr'[^.]*{re.escape(name)}[^.]*\.', x)
        if match:
            return match.group(0).strip()
    return ''

df['col_3'] = df.apply(lambda row: f(row['ColumnA'], row['last_names']), axis=1)

print(df)

说明:

  1. 使用 re.escape(name) 这对于确保正则表达式正确处理名称中的任何特殊字符(例如“.”或“*”)至关重要。
  2. 找到包含名称的整个句子: 正则表达式 [^.]*{re.escape(name)}[^.]*\. 查找以下内容:
  3. [^.]* :任何数量的非句点字符。
  4. {re.escape(name)} :提供的名称。
  5. [^.]* :任何数量的非句点字符。
  6. \. :一个句点,匹配句子的结尾。
  7. 使用 search 而不是 findall 由于我们只在每个字符串中查找一个句子,因此 re.search re.findall 更合适。
  8. 使用 match.group(0) 获取匹配的句子: 如果找到匹配项, match.group(0) 将返回匹配的完整句子。
  9. 处理未找到名称的情况: 如果在循环中没有找到名称,则该函数将返回一个空字符串。

通过这些更改,的 col_3 现在应包含包含列表中姓名的预期句子。

标签:python,pandas,regex,variables
From: 78805127

相关文章

  • 【Python学习手册(第四版)】学习笔记06-Python动态类型-赋值模型详解
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。主要介绍Python的动态类型(也就是Python自动为跟踪对象的类型,不需要在脚本中编写声明语句),Python中变量和对象是如何通过引用关联,垃圾收集的概念,对象共享引用是如何影响多个变量......
  • Python学习手册(第四版)】学习笔记09.3-Python对象类型-分类、引用VS拷贝VS深拷贝、比较
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。这部分稍杂,视需要选择目录读取。主要讲的是对之前的所有对象类型作复习,以通俗易懂、由浅入深的方式进行介绍,所有对象类型共有的特性(例如,共享引用),引用、拷贝、深拷贝,以及比较、......
  • 同时运行多个Python文件
    如何同时运行python的多个文件我有三个文件pop.pypop1.pypop2.py我想同时运行这个文件这些文件正在被一一运行python代码运行所有文件可以使用以下几种方法同时运行多个Python文件:1.使用多线程/多进程:多线程(threading):如果的Pytho......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-56- 多文件上传 - 下篇
    1.简介前边的两篇文章中,宏哥分别对input控件上传文件和非input控件上传文件进行了从理论到实践地讲解和介绍,但是后来又有人提出疑问,前边讲解和介绍的都是上传一个文件,如果上传多个文件,Playwright是如何实现的呢?宏哥看了一下官方的API也有上传多个文件的API,那么今天就来讲解和介绍......
  • 如何使用python模块捕获用户的文本输入
    我正在开发一个项目,它会检测到如果您按“(”,它会自动关闭它“[”和“{”的情况相同,但重点是它检测键盘按钮“{”或“[”不是字符,这意味着如果朋友有不同的方式输入“[”,它将无法工作,因为该程序用于检测“altgr+(”序列,这可能会影响不同语言的键盘因为您不想在按下......
  • 如何更新 numpy 2 的 python 模块?
    在带有pip的Linux上,新的numpy2似乎可以很好地与pandas配合使用:$python3-c'importnumpyasnp;print(np.__version__);importpandasaspd;print(pd.__version__)'2.0.12.2.2但是,在带有miniconda的Windows上,我得到$${localappdata}/miniconda3/en......
  • python BioChemist 数据集的数据字典/描述
    我正在使用生物化学家数据集。我在哪里可以找到包含每个变量描述的“数据字典”?这就是我正在查看的:importpandasaspdfrompydatasetimportdatadata('bioChemists')我已经用谷歌搜索并尝试寻找运算符,但没有运气!pydataset软件包不包含生物化学家数据集的描述......
  • python中的Telebot API不断断开连接
    使用远程机器人,不断断开服务。我暂时让它在发生这种情况时重新启动。下面是我的代码和错误:importrandomimporttelebotfromtelebot.typesimportInlineKeyboardMarkup,InlineKeyboardButtonfromthreadingimportTimer,Eventfromdotenvimportload_dotenvimporto......
  • 来自 PyArrow ChunkedArray 的虚拟编码 PyArrow 表,无需通过 pandas?
    假设我importpyarrowaspaca=pa.chunked_array([['a','b','b','c']])print(ca)<pyarrow.lib.ChunkedArrayobjectat0x7fc938bcea70>[["a","b","b","......
  • 如何用Python制作Android服务?
    我想构建一个简单的Android应用程序,例如PushOver应用程序,它具有TCP服务器并接收其记录的文本消息,然后将其作为推送通知发送。这部分已经完成并且工作正常。但即使GUI应用程序关闭,我也想接收消息。我知道这是可能的,因为PushOver应用程序做到了!我想,我可能需要一......