[每日一练]患某种疾病的患者,正则表达式的匹配

2024-06-04 07:36

本文主要是介绍[每日一练]患某种疾病的患者,正则表达式的匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该题目来源于力扣:

1527. 患某种疾病的患者 - 力扣(LeetCode)

题目要求:

患者信息表: Patients

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。

查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。

按 任意顺序 返回结果表。

查询结果格式如下示例所示。

示例 1:

输入:
Patients表:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
输出:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。

思路流程:

首先,题目要求condition列要求包含字符串“DBAB1”开头,我们会想到用正则表达式的^字符表达字符串的开头。但是condition列包含 多种疾病,当“DBAB1”不属于第一个疾病位置时,^字符会失效。所以我们要用 \b内容\b 形式来进行边界匹配(每个疾病之间会用空格隔开),然后使用.str.coutains()来进行匹配。

注意,在应用.str.coutains()时要添加:regex=True 用来表达传入的参数是正则表达式。

代码实现:

import pandas as pddef find_patients(patients: pd.DataFrame) -> pd.DataFrame:#\b表示字符串的边界。只能在正则表达式中使用result=r'\bDIAB1'return patients[patients['conditions'].str.contains(result,regex=True)]

思路2:

有时候我们对正则表达式不太熟悉,那么不用正则表达式也可以,不过相对麻烦,因为我们要考虑糖尿病在第一个位置或者不在第一个位置的情况。

代码实现:

import pandas as pddef find_patients(patients: pd.DataFrame) -> pd.DataFrame:return patients[patients["conditions"].str.startswith('DIAB1') | patients["conditions"].str.contains(' DIAB1',regex=False)]

拓展(关于pandas自带的执行字符串匹配和操作。):

  1. .str.endswith(suffix[, na]):类似于 .str.startswith(),但是检查字符串是否以指定的后缀结尾。

  2. .str.contains(pat[, case, flags, na, regex]):检查字符串是否包含指定的子字符串或模式。它可以通过正则表达式进行模式匹配。

  3. .str.match(pat[, case, flags, na]):检查字符串是否与指定的正则表达式模式匹配。与 .str.contains() 不同,它只匹配字符串的开头。

  4. .str.extract(pat[, flags, expand]):根据正则表达式模式从字符串中提取匹配的子字符串。可以用于从复杂的文本中提取特定模式的信息。

  5. .str.findall(pat[, flags]):查找字符串中所有与正则表达式模式匹配的子字符串,并返回它们的列表。

  6. .str.startswith()仅用于检查字符串是否以给定的前缀开头。

总结:

大部分匹配内容的时候还是建议使用正则表达式。以上的两个思路正则表达式执行的速度稍微快一点,是311ms,而非正则表达式的执行速度是323ms,而且非正则表达式的方法要把所有的情况都要考虑并且写出来,相对繁琐。

这篇关于[每日一练]患某种疾病的患者,正则表达式的匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029458

相关文章

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点