3.01【python正则表达式以及re模块】

python正则表达式以及re模块

元字符

正则表达式的语法就由表格中的元字符组成,一般用于搜索、替换、提取文本数据

元字符含义
.匹配除换行符以外的任何单个字符
*匹配前面的模式0次或1次
+匹配前面的模式1次或多次
?匹配前面的模式0次或1次
[]用于定义字符集,匹配方括号内的任何字符
^匹配字符串的开头
$匹配字符串的结尾
\用于转义特殊字符,使其失去特殊含义
[^]匹配不在字符集中的任何字符
|用于表示‘或’,匹配两个或多个选择之一
\d匹配任何数字字符
\D匹配任何非数字字符
\w匹配任何字母数字字符或下划线
\W匹配任何非字母数字字符或下划线
\s匹配任何空白字符
\S匹配任何非空白字符

re模块

常用的re模块内置方法:

re.方法名(表达式,文本数据)

  1. re.search(pattern, string):从字符串中搜索匹配给定模式的第一个出现,并返回一个匹配对象。
  2. re.match(pattern, string):尝试从字符串的开头匹配给定模式,如果成功匹配,则返回一个匹配对象。
  3. re.findall(pattern, string):查找字符串中所有与给定模式匹配的非重叠部分,并返回一个列表。
  4. re.sub(pattern, replacement, string):在字符串中查找与给定模式匹配的部分,并用替换字符串替换它们。
  5. re.compile(pattern):将正则表达式模式编译为一个正则表达式对象,以便进行复用和更高效的操作。

search()

从给定的字符串的开头开始搜索,并在字符串中查找第一个与模式匹配的子字符串。它只返回第一个匹配的结果,并且不会查找后续的匹配

import repattern = r"apple"
string = "I have an apple and a banana"
match = re.search(pattern, string)
if match:print(type(match))              # <class 're.Match'>print("Found:", match.group())  # Found: appleprint("Start:", match.start())  # Start: 10print("End:", match.end())      # End: 15

match()

与search()相似,match()是从字符串的开头开始尝试匹配给定的正则表达式模式

import repattern = r"apple"
string = "I have an apple and a banana"
match = re.match(pattern, string)
if match:print("Found:", match.group())  # Found: appleprint("Start:", match.start())  # Start: 10print("End:", match.end())      # End: 15

findall()

查找并返回字符串中与给定正则表达式模式匹配的所有非重叠子字符串

import repattern = r"\d+"
string = "There are 123 apples and 456 bananas"
matches = re.findall(pattern, string)
print("Matches:", matches)  # 输出: Matches: ['123', '456']

sub()

将搜索到的字符替换

import repattern = r"apple"
string = "I have an apple and a banana"
replacement = "orange"new_string = re.sub(pattern, replacement, string)
print(new_string)  # I have an orange and a banana

compile()

用于将正则表达式模式编译为一个可重复使用的正则表达式对象

import repattern = r"\d+"
string = "There are 123 apples and 456 bananas"regex = re.compile(pattern)
matches = regex.findall(string)
print(matches)  # ['123', '456']

分组模式

以下是用()分组的正则表达式模式

group()中的参数可以提取分组后的数据的索引,但这个索引是从1开始的,为空则返回全部

import remob = re.compile(r'(\+86)(\d\d\d)(\d\d\d\d)(\d\d\d\d)')
phone_number1 = mob.search('我的电话号码是+8618900043210')
print('电话号码' + phone_number1.group())  # 电话号码+8618900043210
print('前缀' + phone_number1.group(1))     # 前缀+86
print('前三位' + phone_number1.group(2))   # 前三位189
print('中四位' + phone_number1.group(3))   # 中四位0004
print('后四位' + phone_number1.group(4))   # 后四位3210

贪婪匹配与非贪婪匹配

默认情况下,正则表达式使用贪婪匹配。它会尽可能多地匹配字符。

在贪婪模式下,量词后面没有添加?时,它会匹配尽可能长的字符串。非贪婪模式则反之

例如,对于正则表达式 a.*b 和字符串 aabab,贪婪匹配将匹配整个字符串 "aabab",而非贪婪模式仅仅是第一个 "aab"

import re# 贪婪匹配示例
pattern1 = r'a.*b'
pattern2 = r'a.*?b'string = 'aabab'
match1 = re.search(pattern1, string)
match2 = re.search(pattern2, string)print(f"贪婪模式:{match1.group()}")     # 贪婪模式:aabab
print(f"非贪婪模式:{match2.group()}")   # 非贪婪模式:aab

^和$

^表示匹配字符串的开头。当 ^ 放置在正则表达式的开头时,它表示要匹配的内容必须出现在字符串的开头位置

import repattern = r'^(aaa)(\d+)'
regex = re.compile(pattern)
match1 = regex.search('aaa666这是信息的格式')
match2 = regex.search('信息的格式是aaa666')
print(match1.group())  # aaa666
print(type(match2))  # <class 'NoneType'>

可以看到当开头不存在^所匹配的字符串时就会采不到数据

同理$就是表示匹配字符串的结尾,它可以用来检查一个字符串是否以特定的模式结束

import repattern = r'(aaa)(\d+)$'
regex = re.compile(pattern)
match1 = regex.search('aaa666这是信息的格式')
match2 = regex.search('信息的格式是aaa666')
print(type(match1))  # <class 'NoneType'>
print(match2.group())  # aaa666

多行模式(Multiline Mode)

在大部分爬虫案例中我们需要处理包含换行符的文本(当然现在爬虫也不咋用正则了~)这时就会用到多行模式(Multiline Mode)

import repattern2 = r"^abc$"
string2 = "abc\n123\nabc"
matches2 = re.findall(pattern2, string2, re.MULTILINE)
print(matches2)  # ['abc', 'abc']

(?P<>)

(?P…) 是正则表达式中的一个语法构造,用于给一个子模式(子表达式)命名,以便在匹配结果中可以通过名称来引用

import repattern = r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})"
text = "Today's date is 2022-09-30."match = re.search(pattern, text)
if match:year = match.group("year")month = match.group("month")day = match.group("day")print(f"Year: {year}, Month: {month}, Day: {day}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux配置编程环境+云服务器上传文件

Java环境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd&#xff1a;传送门 cgbd&#xff1a;传送门 | 传送门

数据可视化【十四】交互式过滤地区分布图

在前面的博客中已经介绍了如何绘制地区分布图&#xff0c;这一节学习如何绘制交互式过滤地区分布图。如果对绘制地区分布图还不熟悉的话可以了解一下之前我写的博客&#xff1a;数据可视化【十三】地区分布图 整体的框架仍然是在之前的基础上进行修改&#xff0c;主要是添加交…

Ubuntu环境搭建

本文记录了一些常用的Ubuntu软件 然后首先修改软件源&#xff1a;软件和更新->Ubuntu软件->下载自&#xff1a;其他站点&#xff08;修改为阿里云&#xff09; 在关闭的时候需要更新什么的 然后修改更新方式&#xff0c;将不支持的更新去掉 常用的Windows软件 网易云…

1 两数之和

虽然只是一道很简单的题&#xff0c;但是也给我很多思考。 刚看到这道题的时候没有仔细思考&#xff0c;直接写了个排序和二分查找&#xff0c;想着对每个数字查找另一个数字会不会出现&#xff0c;复杂度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn)&#xff0c;主要训练了一下…

834 树中距离之和

这道题我自己的想法只有对每个点都用一遍Dijkstra然后再求和&#xff0c;显然会超时&#xff0c;所以我都没有尝试。 研究了一下题解&#xff0c;发现题解很巧妙&#xff0c;自己对树的处理还是太稚嫩&#xff0c;之前树链剖分学的都忘光了。 对于固定根节点的&#xff0c;我…

75 颜色分类

题目已经提示可以一遍扫描了但是我还是没有想到&#xff0c;其实双指针的想法我已经有了&#xff0c;但是一想到有问题就觉得无法实现。这也揭示了我思维上的问题&#xff1a;用一种方法解决问题遇到困难第一件事情不是想着如何攻克而是想着换一种方法。对自己的思维也不自信。…

141 环形链表

要求使用空间复杂度为O(1)的方法&#xff0c;可是我并没有想到。我想到的只有用一个哈希表记录一下所有访问过的节点。 题解给出的空间复杂度为O(1)的方法是使用两个指针&#xff0c;然后让一个一次跑一步&#xff0c;一个一次跑两步&#xff0c;如果跑的快的能追上跑的慢的就…

数据可视化【十五】

经验法则&#xff1a;在颜色不相邻的时候加上背景颜色颜色的个数为6~12比较好。 颜色其实很大程度上由背景决定而不是他本身决定。 D3 Scale-Chromatic 有许多颜色刻度&#xff0c;可以根据自己的需要进行选择。 参考论文&#xff1a;Practical Rules for Using Color in Cha…

Ubuntu修改/删除主目录下的中文文件夹

在Ubuntu的主目录下一般是有一些中文的目录&#xff0c;例如桌面&#xff0c;视频等等&#xff0c;还无法修改名称&#xff0c;在一群英文文件夹里面显得有些突兀&#xff08;Ubuntu终端下的中文一点也不好看&#xff09;&#xff0c;就想把这些文件夹修改一下&#xff0c;结果…

19 删除链表的倒数第N个

题目的意思很简单&#xff0c;就是删除一个链表倒数第N个节点。 需要用到链表的标准操作&#xff1a;快慢指针。 我们让一个快指针先指向第N个元素&#xff0c;这个时候快指针总比慢指针领先N个元素&#xff0c;等到快指针指向链表尾部的时候慢指针就指向需要删除的元素。 之前…

844. Backspace String Compare

题目的意思大概是有两个字符串&#xff0c;其中的#表示退格键&#xff0c;让比较最后两个字符串是否相当。 很容易想到的思路就是用一个栈进行模拟这个过程&#xff0c;特别需要注意如果一个串是空串也是可以退格的。 但是很容易想到的另一个特性就是&#xff0c;前面的字符有…

链表三连击

876&#xff1a;链表的中间节点 206&#xff1a;反转链表 143&#xff1a;重排练表 链表的中间节点 这个题一看就是最简单的快慢指针&#xff0c;但是在具体实现的时候我还是犹豫思考了一下&#xff1a;要不要在链表前面放置哑节点&#xff0c;快指针应该什么时候判断已经到达…

D3力导引图

学习力导引图的时候在网上没有找到什么好的教程&#xff0c;支离破碎地进行了一段时间的学习&#xff0c;还阅读了d3的关于d3的官方文档&#xff0c;但是始终觉得不的要领。这里记录一下我学习力导引图的一些心得以及推荐一下学习资源。 学习资源 官方文档&#xff1a;https:…

Ubuntu Pycharm启动后卡住无法操作

昨天还好好的&#xff0c;今天打开Pycham突然卡住了&#xff0c;卡在了那个preparing workspace的地方&#xff0c;然后在网上搜索了很多方法都没用。直到在网上看到有个大佬说是因为搜狗输入法的问题&#xff0c;我才突然记起来昨天安装了搜狗输入法。。。 kill掉卡住的Pycha…

327 区间和的个数

题目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

浏览器访问本地文件

之前一直苦恼无法在浏览器访问本地文件&#xff0c;尤其是写的网页需要调用外部数据的时候&#xff0c;今天学习到可以用python很方便的解决问题 如果有python3环境&#xff0c;直接在对应的文件夹下运行&#xff08;这里是Ubuntu环境&#xff0c;如果是Windows应该在命令行也…

Ubuntu使用jupyter notebook +导出PDF

因为最近需要做数据分析的工作&#xff0c;所以复习了一下numpy和pandas&#xff0c;并安装了jupyter notebook进行数据分析&#xff0c;这里记录一下环境的设置。 ps:jupyter notebook真香 安装 python3 -m pip install --upgrade pip //升级pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

给服务器重装了一下系统&#xff0c;结果报了上述错误&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在网上找…

Ubuntu20.04 更新后黑屏无法加载驱动

本来我的电脑好好的&#xff0c;突然提示说有可应用的更新&#xff0c;我想都没想就直接更新了&#xff0c;可是没想到更新以后经过grub以后就会黑屏&#xff0c;一动不动&#xff0c;在网上搜索了许多&#xff0c;提到的说法是在grub界面对第一个Ubuntu的启动按e进行编辑 在倒…