正则表达式,可谓是数据处理的神器,我算是见识到了它的威力。之前也接触过,但一直没有搞明白。今再次接触,定要学个明明白白。算有一些入门了,就分享到此处。一是方便日后自己查找,二是方便小伙伴一起交流学习。日后有更多关于正则化的学习、应用,也将会分享于此。

一:re.findall

在做数据处理的时候,最烦遇到的是一种什么情况呢?

  1. 数据有规律的存储了
  2. 然后存储好的一堆数据,又需要解析出来用
  3. 一组数据里面各种形形色色的格式

如果是CSV文件,读取出来的,都当做字符串。要想取个什么东西,就要按照字符串的处理方式,例如find,split等等,较为繁琐。但是,正则化就显得尤为的简单,然而,这就需要找到数据中的一般规律,然后用re取出来,这个流程就较为的简单了。

本小节主要知识点如下:

  1. re.findall 在字符串中返回正则表达式所匹配的的所有子串,并返回一个列表。如果一个都没有匹配上,则返回空列表
  2. \d 匹配字符串中的数字
  3. *  重复0次或更多次  例如:35.26  35 + . + 26  [0-9] + . + [0-9]
  4. 真 . 需加 \ ,即 \.;当然,要查找\本身,你也得用\\

正则匹配中的元字符有: . ^ $ * + ? { [ ] \ | ( )。这些元字符的主要作用是跟其它的标准字符一起组成匹配的规则,所以可以认为它们是带有其它作用的特殊字符。

匹配字符的规则

(1)通过正反括号"["和"]"确定要匹配的字符

“[]”这个括号里面可以例举出想要匹配的字符集合,也可以通过限定字符集的范围确定。例如,[abc] 和[a-c]都表示匹配"a", "b", 或 "c"中的任意一个字符。

如果字符本身是元字符,那么它在 “[]”里面的时候就是一个普通字符,例如:[[]就是表示匹配字符“[”。

(2)取反元字符 ^ 的使用

在方括号中,首字符如果使用取反字符^的话,就表示匹配初括号中的字符之外的其它字符。例如,[^5] 将匹配除 "5" 之外的任意字符。

(3)反斜杠“\”的使用

作用1:将那些在正则匹配中有特殊意义的字符转换成普通的字符,或者将普通字符标记成它代表的特殊意义

作用2:用来确定要匹配的字符类型,规则如下:

\d  匹配任何十进制数;它相当于类 [0-9]。
\D  匹配任何非数字字符;它相当于类 [^0-9]。

\s  匹配任何空白字符;它相当于类  [ \t\n\r\f\v]。
\S  匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。

\w  匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W  匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。

匹配字符的个数

re中主要使用*、+、?还有花括号{}来确定匹配的字符的个数

(1)* 指定前一个字符可以被匹配零次或更多次,而不是只有一次。ca*t 将匹配 "ct" (0 个 "a" 字符), "cat" (1 个 "a"), "caaat" (3 个 "a" 字符)等等

(2)+ 表示匹配一或更多次。用同一个例子,ca+t 就可以匹配 "cat" (1 个 "a"), "caaat" (3 个 "a"), 但不能匹配 "ct"。

(3)?  匹配一次或零次;你可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 "homebrew" 或 "home-brew"。

(4){m,n},其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n 个重复。举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。它不能匹配 "ab" 因为没有斜杠,也不能匹配 "ab" ,因为有四个。

光说不练假把式。下面,就用一个案例,来将上面四点,做个实践。上面4点看不懂的不要紧,下面的案例包你看明白,为你初入正则化,做开门解惑。

案例:今有一张数据统计表,数据存储为CSV格式,数据共四列(没看到四列的,光标放到表格里面,向右移动,即可看到),内容如下:

ddaae641bf2af78c1a02ba43575b0d51_3001_2849_0.1440486666667_0.1440486666667.png [0] [0.6761001944541931] [[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]]
2.25.136083661060415706315254052090742684427_4000_3000_0_0.png [0, 0] [0.7710305452346802, 0.5624949932098389] [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
2.25.325405860827049753751982304033775186562_3370_3214_0_0.png [0, 0, 0] [0.8847285509109497, 0.7925058603286743, 0.5061626434326172] [[61.759857177734375, 317.8360595703125, 316.9251708984375, 758.53271484375], [119.5316162109375, 86.29457092285156, 465.26458740234375, 359.308349609375], [676.3946533203125, 208.73971557617188, 899.0660400390625, 524.486328125]]

截图的样子如下 ,下面这个表格截图看着直观些:

做AI图像这块的,应该很容易可以看出来,这四列是有具体含义的。我这是做目标检测任务,四列分别是:

  1. 图像名
  2. 标签0 or 1 list
  3. 疑似度分数 list
  4. 目标框的坐标 list

后面,我们看看操作过程:(不为什么目的,就学习数据的正则化)

import pandas as pd
import re
import numpy as npmy_csv_path = r'tb.csv'content = pd.read_csv(my_csv_path, delimiter=',', header=None, index_col=False)name = content[0].values     # 第一列,文件名
pcls = content[1].values      # 第二列,类别
scores = content[2].values    # 第三列,分数
bbox = content[3].values      # 第四列,坐标# re.findall在字符串中返回正则表达式所匹配的的所有子串,并返回一个列表。如果一个都没有匹配上,则返回空列表。
# \d 匹配字符串中的数字
# * 重复0次或更多次  例如:35.26  35+.+26  [0-9]+.+[0-9] 真.需加\,即\.
def cls2list(i):print("i:", i)# \d 匹配数字 [0, 0]cls_str = re.findall("(\d)",i)print("cls_str:", cls_str)cls_list = [float(i) for i in cls_str]print("cls_list:", cls_list)print("cls_list.type:", type(cls_list))return cls_listdef score2list(i):# \d 匹配数字,真.需加\,即\.# 例如:[0.7710305452346802, 0.5624949932098389]  0 + . + 7710305452346802print("i:", i)score_str = re.findall("(\d*\.\d*)",i)print("score_str:", score_str)score_list = [float(i) for i in score_str]# box_list = np.array(box_list).reshape(-1, 2)        改变形状print("score_list:", score_list)print("score_list.type:", type(score_list))return score_listdef box2list(i):""":param i: 一張圖片中文本類型的box xmin,ymin,xmax,ymax:return: 二維數組描述框"""print(i)# [0-9] 匹配字符串中的所有数字# * 重复0次或更多次  例如:35.26  35+.+26  [0-9]+.+[0-9] 真.需加\,即\.box_str = re.findall("([0-9]*\.[0-9]*)", i)        # 只能分数# box_str = re.findall(r'\d+(?:\.\d+)?', i)          # 分数和整数都行print("box_str:", box_str)box_list =[float(i) for i in box_str]print("box_list:", box_list)print("box_list.type:", type(box_list))return box_listfor i in range(2):name_i = name[i]cls_i = pcls[i]scores_i = scores[i]bboxes_i = bbox[i]print(name_i, cls_i, scores_i, bboxes_i)print(type(name_i), type(cls_i), type(scores_i), type(bboxes_i))# 1.对cls做数据正则化  [0, 0]cls_i_list = cls2list(cls_i)print("\n")# 2.对score做数据正则化 ['0.7710305452346802', '0.5624949932098389']score_i_list = score2list(scores_i)print("\n")# 3.对bbox做数据正则化# [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906],# [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]bbox_i_list = box2list(bboxes_i)print("\n")

打印的结果显示如下:

ddaae641bf2af78c1a02ba43575b0d51_3001_2849_0.1440486666667_0.1440486666667.png [0] [0.6761001944541931] [[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]]
<class 'str'> <class 'str'> <class 'str'> <class 'str'>
i: [0]
cls_str: ['0']
cls_list: [0.0]
cls_list.type: <class 'list'>i: [0.6761001944541931]
score_str: ['0.6761001944541931']
score_list: [0.6761001944541931]
score_list.type: <class 'list'>[[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]]
box_str: ['273.28466796875', '175.67626953125', '402.2430419921875', '328.661865234375']
box_list: [273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]
box_list.type: <class 'list'>2.25.136083661060415706315254052090742684427_4000_3000_0_0.png [0, 0] [0.7710305452346802, 0.5624949932098389] [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
<class 'str'> <class 'str'> <class 'str'> <class 'str'>
i: [0, 0]
cls_str: ['0', '0']
cls_list: [0.0, 0.0]
cls_list.type: <class 'list'>i: [0.7710305452346802, 0.5624949932098389]
score_str: ['0.7710305452346802', '0.5624949932098389']
score_list: [0.7710305452346802, 0.5624949932098389]
score_list.type: <class 'list'>[[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
box_str: ['190.70089721679688', '38.103851318359375', '450.9465637207031', '446.1026916503906', '615.7803955078125', '33.51222229003906', '808.9849853515625', '279.001953125']
box_list: [190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906, 615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]
box_list.type: <class 'list'>
补充:取整数:value = re.findall("(\d+)", contour_value)    例如:“563,849,698”  
补充:整数或小数,lineArr = re.findall('\d+\.*\d*', contour_value)    例如:56,98,53.635,1296.36598备注:\d+ 不配小数点前面的\.就是.  \.*表示可以匹配0次或多次.   \d*匹配小数点后面的

看明白上面代码里面的注释了吗?思路和过程都打印了出来。

re.findall 在字符串中返回正则表达式所匹配的的所有子串,并返回一个列表。如果一个都没有匹配上,则返回空列表。

  1. 类, [0, 0],单个的数字,用 \d 来做数字匹配。就可以全取出来了,正则表达式为:(\d)
  2. 疑似度分数,[0.984,0.765],拆分来看,是由数字和.(点)组成的,通俗点就是:0 + . + 984,正则表达式为:(\d*\.\d*)
  3. 坐标框,[[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]],拆分来看,是由273 + . +28466796875,正则表达式为:([0-9]*\.[0-9]*),[0-9] 表示匹配字符串中的0-9所有数字,*为多次,\. 就表示为.,后面重复

这就是正则表达式的入门,为有些明白正则表达式其中的内涵了。emeditor文档编辑软件里面,就可以直接在上面进行正则化匹配,方便验证。

后面继续学习,将继续分享到这里。喜欢和感兴趣的,欢迎持续关注和收藏,有任何疑问的,可以在下方留言,一起交流。

补充1:如何取出一组字符串中的数字(整数或小数)

import re
>>> s = '4 and 10.2356'
>>> re.findall(r'\d+(?:\.\d+)?', s)
['4', '10.2356']
>>> print(int(re.findall(r'\d+(?:\.\d+)?', s)[0]))
4
>>> print(float(re.findall(r'\d+(?:\.\d+)?', s)[1]))
10.2356
  • \d+: matches one or more digits.
  • \d+.\d+ :matches one or more digits plus any single character plus one or more digits.
  • \d+.\d+ :matches one or more digit characters pus a literal dot plus one or more digits.
  • \d+(?:.\d+)? :matches integer as well as floating point numbers because we made the pattern which matches the decimal part as optional. ? after a capturing or non-capturing group would turn the whole group to an optional one.

原文链接:https://blog.csdn.net/irober/article/details/107091418

补充二:字符补全

任务:只知道前面,或者中间的字符,想要匹配所有的字符

def re_name(raw_string, cop_string):findword = cop_string+r'.\d*'  # 取该字符串以及其后面任意多个数字字符pattern = re.compile(findword)results = re.findall(pattern, raw_string)print(results)return resultstemp = '1235_5_5, 1235_5_61, 123_5_6,1298'
re_name(temp, cop_string='1235_5_')

输出打印结果:

['1235_5_5', '1235_5_61']

其他类似补充:

def re_name(raw_string, cop_string):findword = cop_string+r'.{2}'  # 取该字符串以及其后面2个字符数据pattern = re.compile(findword)results = re.findall(pattern, raw_string)print(results)temp = '1235_5_5, 1235_5_61, 1235_5_623, 1298'
re_name(temp, cop_string='1235_5_')output:
['1235_5_5,', '1235_5_61', '1235_5_62']#######################################################################def re_name(raw_string, cop_string):findword = r'.{1}' + cop_string+r'.{2}'  # 取该字符串以及其后面2个字符数据pattern = re.compile(findword)results = re.findall(pattern, raw_string)print(results)temp = '1235_5_5, 1235_5_61, 1235_5_623, 1298'
re_name(temp, cop_string='35_5_')output:
['235_5_5,', '235_5_61', '235_5_62']#######################################################################def re_name(raw_string, cop_string):findword = cop_string + r'.\d?_\d?_\d?_\d?'  # _2103845659_4_6_1_5.pngpattern = re.compile(findword)results = re.findall(pattern, raw_string)print(results)return resultstemp = '1235_5_5_2_1_1, 1235_5_61_6_3_6, 123_5_6_5, 1298'
re_name(temp, cop_string='1235_5_')output:
['1235_5_5_2_1_1', '1235_5_61_6_3_6']

参考地址:在Python中使用正则re查找特定字符串、去除重复数据、取固定格式的特定字符串_小白_努力-CSDN博客https://blog.csdn.net/laobai1015/article/details/88541055

Python用re正则匹配处理字符_u011412768的博客-CSDN博客https://blog.csdn.net/u011412768/article/details/109559870

python re 数据正则化匹配--笔记总览相关推荐

  1. python气象数据可视化学习笔记6——利用python地图库cnmaps绘制地图填色图并白化

    文章目录 1. 效果图 2. cnmaps简介及安装 2.1 写在前面 2.2 cnmaps简介和安装 3. 导入库 4. 定义绘图函数 4.1 使用get_adm_maps返回地图边界 4.2 ax ...

  2. python与数据思维基础笔记_Python小课笔记--Python基础:数据和函数(二)

    截图来自Python小课 文|仟樱雪 在Python小课-1-2节中,已经学习了基础模块--数据--数据类型(整数.字符串),以及基础模块--变量,基础模块--函数(input函数.print函数). ...

  3. python sci数据_scanpy学习笔记:用Python分析单细胞数据

    Scanpy 是一个基于 Python 分析单细胞数据的软件包,内容包括预处理,可视化,聚类,拟时序分析和差异表达分析等.本文翻译自 scanpy 的官方教程 Preprocessing and cl ...

  4. python气象数据可视化学习笔记7——利用cartopy+cnmaps和ERA5数据绘制填色图并对中国地区白化

    文章目录 1. 效果图 2. 绘制基于中国地区的填色图(大地图) 3. 添加南海小地图 4. 读取数据并传入绘图函数 5. 代码完整版 1. 效果图 前序博文cnmaps填色图介绍了cnmaps在线地 ...

  5. Python气象数据可视化学习笔记5——基于cartopy绘制contour并对中国地区进行白化(包含南海)

    基于cartopy绘制contour并对中国地区进行白化(包含南海) 1. 写在前面 利用cartopy画填色图已经掌握,这一篇主要记录了在填色的基础上叠加白化.主要参考了气象家园的两篇帖子,并进行了 ...

  6. python用merge匹配和左连接_左手用R右手Python系列——数据合并与追加

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 本文作者:天善智能社区专家杜雨 今天这篇跟大家介绍R语言 ...

  7. 数据分析学习总结笔记15:时间序列分析及Python实现

    文章目录 1 引言 2 时间序列的特性 2.1 自相关 2.2 季节性 2.3 平稳性 3 时间序列建模 3.1 移动平均法 3.2 指数平滑法 3.3 双指数平滑法 3.4 三重指数平滑法 3.5 ...

  8. 数据分析学习总结笔记17:文本分析入门案例实战

    文章目录 1 数据准备 2 分词 3 统计词频 4 词云 5 提取特征 6 用sklearn进行训练 1 数据准备 数据样例如下, 数据总量为7.7万+: 本节通过一个实战的例子来展示文本分析的最简单 ...

  9. python的rbind_左手用R右手Python系列—数据合并与追加

    原标题:左手用R右手Python系列-数据合并与追加 感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 今 ...

最新文章

  1. 没事做做题之棋盘上的距离
  2. python讲解from ctypes import *调用C语言动态链接库
  3. Java泛型的不变性和作用域
  4. C语言二月天数计算,关于计算两个日期间天数的代码,大家来看看
  5. Redis 与 hash (哈希)相关的常用命令
  6. Sequelize Unknown column 'createdAt' in 'field list'?
  7. nginx 安全优化
  8. [android 游戏源码]-体育游戏-疯狂足球源码
  9. U盘数据丢失后怎样恢复
  10. 什么是即席查询及即席查询实现
  11. win10系统如何启动sql服务器,win10系统打开SQL Server数据库服务的方法
  12. 用C++做的文本分割器(就是黑乎乎的那个)
  13. 【沃顿商学院学习笔记】宏观经济学——09欧元区Euro Zone
  14. 【Salesforce】地理位置情報項目を使って周辺検索 GMaps
  15. 各个国家的市场分析(俄罗斯,白俄罗斯)
  16. hdu5208 Where is Bob 数位dp
  17. 一气呵成:用Compose完美复刻Flappy Bird!
  18. 超市微信小程序怎么做_微信小程序便利店怎么开?便利店和百货超市怎么开发小程序?...
  19. 计算机金融专业美国学校排名,美国金融专业都有哪些种类?
  20. 华为鸿蒙HarmonyOS,华为鸿蒙HarmonyOS 2.0

热门文章

  1. 基于PHP+MySQL音乐网站的设计与实现
  2. com.mysql.cj.exceptions.CJCommunicationsException
  3. RLException: Invalid roslaunch XML syntax: mismatched tag: line 3, column 2报错
  4. 百度校园招聘历年经典面试题汇总:Java开发岗
  5. 2552: 好好学习天天向上
  6. OJ 2552: 好好学习天天向上
  7. 大型 web 前端架构设计-面向抽象编程入门
  8. Android仿支付宝UI功能开发,UI实例--仿支付宝首页头部伸缩效果
  9. 使用html仿支付宝首页,jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
  10. 中兴c300业务板_全新中兴C300 OLT ETGO板卡 业务板 EPON PON板 GTGO板卡