❶ 学python正则表达式,这一篇就够了
正则表达式是一个特殊的字符序列,可以帮助您使用模式中保留的专门语法来匹配或查找其他字符串或字符串集。 正则表达式在UNIX世界中被广泛使用。
注:很多开发人员觉得正则表达式比较难以理解,主要原因是缺少使用或不愿意在这上面花时间。
re模块在Python中提供对Perl类正则表达式的完全支持。如果在编译或使用正则表达式时发生错误,则re模块会引发异常re.error。
在这篇文章中,将介绍两个重要的功能,用来处理正则表达式。 然而,首先是一件小事:有各种各样的字符,这些字符在正则表达式中使用时会有特殊的意义。 为了在处理正则表达式时避免混淆,我们将使用:r'expression'原始字符串。
匹配单个字符的基本模式
编译标志可以修改正则表达式的某些方面。标志在re模块中有两个名称:一个很长的名称,如IGNORECASE,和一个简短的单字母形式,如。
1.match函数
此函数尝试将RE模式与可选标志的字符串进行匹配。
下面是函数的语法 :
这里是参数的描述 :
pattern : 这是要匹配的正则表达式。
string : 这是字符串,它将被搜索用于匹配字符串开头的模式。 |
flags : 可以使用按位OR(|)指定不同的标志。 这些是修饰符,如下表所列。
re.match函数在成功时返回匹配对象,失败时返回None。使用match(num)或groups()函数匹配对象来获取匹配的表达式。
示例
当执行上述代码时,会产生以下结果 :
2.search函数
此函数尝试将RE模式与可选标志的字符串进行匹配。
下面是这个函数的语法 :
这里是参数的描述 :
pattern : 这是要匹配的正则表达式。
string : 这是字符串,它将被搜索用于匹配字符串开头的模式。 |
flags : 可以使用按位OR(|)指定不同的标志。 这些是修饰符,如下表所列。
re.search函数在成功时返回匹配对象,否则返回None。使用match对象的group(num)或groups()函数来获取匹配的表达式。
示例
当执行上述代码时,会产生以下结果 :
3.匹配与搜索
Python提供基于正则表达式的两种不同的原始操作:match检查仅匹配字符串的开头,而search检查字符串中任何位置的匹配(这是Perl默认情况下的匹配)。
示例
当执行上述代码时,会产生以下结果 :
4.搜索和替换
使用正则表达式re模块中的最重要的之一是sub。
模块
此方法使用repl替换所有出现在RE模式的字符串,替换所有出现,除非提供max。此方法返回修改的字符串。
示例
当执行上述代码时,会产生以下结果 :
5.正则表达式修饰符:选项标志
正则表达式文字可能包含一个可选修饰符,用于控制匹配的各个方面。 修饰符被指定为可选标志。可以使用异或(|)提供多个修饰符,如前所示,可以由以下之一表示 :
6.正则表达模式
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | ),所有字符都与其自身匹配。 可以通过使用反斜杠将其转换为控制字符。
7.正则表达式示例
字符常量
字符类
特殊字符类
重复匹配
非贪婪重复
这匹配最小的重复次数 :
用圆括号分组
反向引用
这与以前匹配的组再次匹配 :
备择方案
python|perl : 匹配“python”或“perl”
rub(y|le) : 匹配 “ruby” 或 “ruble”
Python(!+|?) : “Python”后跟一个或多个! 还是一个?
锚点
这需要指定匹配位置。
带括号的特殊语法
开课吧广场-人才学习交流平台-开课吧
❷ python正则表达式是什么呢
python正则表达式如下:
在python中,所谓的“正则表达式”指的是通常被用来检索、替换那些符合某个模式的一段文本。具体而言,它的作用是检测某个字符串是否符合规则和提取网页字符串中想要的数据。
正则表达式是对字符串提取的一套规则,我们把这个规则用正则里面的特定语法表达出来,去匹配满足这个规则的字符串。正则表达式具有通用型,不仅python里面可以用,其他的语言也一样适用。
python的编程特点:
速度快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。
免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。
❸ Python中的正则表达式
因为正则表达式中有两组小括号,即两个分组
findall会以元组乱销形式返回所有分组中的内容,即[('127.0.0.1', '.1')]
其中'127.0.01'表示匹配最外层大括号的内容
'.1'表示匹配'.[0-9]{1,3}'的内容(最后一次重复时为.1)
由于('.[0-9]{1,3}')为需要重复三次的分组,该括号不能省略
而使用findall就一定会显示括号分组的内容
若想只显示127.0.0.1而不哗梁游显示'.1',可考虑使用match方法
返回从字符串起始位置开始,第一次匹配正则表达式的内容
match返回的结果为re.Match对象,可通过group()显示匹配的字符串,渣袭即127.0.0.1
通过groups()显示匹配的所有分组,即('127.0.0.1', '.1')
如图所示:
❹ Python 正则表达式(完整版)
注意点:
以上量词都是贪婪模式,会尽可能多的匹配,如果要改为非贪婪模式,通过在量词后面跟随一个 ? 来实现
断言不会匹配任何文本,只是对断言所在的文本施加某些约束
前瞻 : exp1(?=exp2) exp1 后面的内容要匹配exp2
负前瞻 : exp1(?!exp2) exp1 后面的内容不能匹配exp2
后顾: (?<=exp2)exp1 exp1 前面的内容要匹配exp2
负后顾 : (?<!exp2)exp1 exp1 前面的内容不能匹配exp2
例如:我们要查找hello,但是hello后面必须是world,正则表达式可以这样写: "(hello)s+(?=world)" ,用来匹配 "hello wangxing" 和 "hello world" 只能匹配到后者的hello
(?(id)yes_exp|no_exp) :对应id的子表达式如果匹配到内容,则这里匹配yes_exp,否则匹配no_exp
❺ Python正则表达式(二)
上节我们说到 Python 正则表达式的基本字符,以及这些字符的用法
今天,我们继续讲讲 Python 中一些扩展标记法,以及一些特殊序列
(?...) : 这种扩展标记法以括号内 ? 开头,其后第一个字符决定了采用什么样的语法。
在 ? 后面添加( 'a', 'i', 'L', 'm', 's', 'u', 'x' 中的一个或多个),然后加上匹配规则。
这些字符对正则表达式设置以下标记,免去设置 flag 参数
注意 : 'a', 'L', 'u' 作为内联标记是相互排斥的,它们不能结合在一起
括号分组的非捕获版本,该分组所匹配的子字符串 不能 在执行匹配后被获取或是在之后的模式中被引用
可以配合 | 和 {m} 使用
为分组再指定一个组合名
每个组合名只能用一个正则表达式定义,只能定义一次
反向引用一个命名组合
匹配前面那个名字叫 name 的命名组中匹配到的字符串
注释信息,里面的内容会被忽略。
哈哈,是不是没看懂,没事,举个栗子
看看,是不是一下子就明了了。
哈哈,这个又看不懂?
思考一下,既然有根据后面字符断言的,那么根据前面字符来断言,也是很合理的,
如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern , no-pattern 可选,也可以被忽略。
是不是有点像 if else 三目运算,其中 id 和 name 是分组 id 、和指定的分组名 name
照旧,举个栗子吧
看了栗子是不是有点糊涂呢,我们来解析一下这个正则表达式
其结果匹配的就是 <[email protected]> 和 [email protected] 。
而不会匹配 <[email protected] ' 和 <[email protected]
但是上面的第三个结果为啥不一样呢?
因为 findall 允许返回空匹配的,在有 ? 的情况下,所以它会分两种情况去匹配
今天讲了一些扩展标记法,其实没那么难,多看看例子,多练习练习。
下节将介绍 re 模块各函数的用法,敬请期待......
❻ 从零开始学Python爬虫(四):正则表达式
Regular Expression, 正则表达式, 种使 表达式的 式对字符串进 匹配的语法规则。
我们抓取到的 源代码本质上就是 个超 的字符串, 想从 提取内容。 正则再合适不过了。
正则的优点: 速度快, 效率 , 准确性 正则的缺点: 新 上 难度有点 。
不过只要掌握了正则编写的逻辑关系, 写出 个提取 内容的正则其实并不谈旦复杂
正则的语法: 使 元字符进 排列组合 来匹配字符串
在线测试正则表达式网址:
https://tool.oschina.net/regex/
元字符: 具有固定含义的特冲旦殊符号 常 元字符:
量词: 控制前 的元字符出现的次数
贪婪匹配和惰性匹配
这两个要着重的说 下,因为我们写爬 的最多的就是这个惰性匹配。
先看案例
那么接下来的问题是, 正则我会写了, 怎么在python程序中使 正则呢?答案是re模块
re模块中我们只需要记住这么 个功能就 够我们使 了。散侍扰
下面一个案例,是练习用正则表达式提取豆瓣电影top250的数据并保存,一起来学一下吧。
❼ python的正则表达式
1,正则表达式的一些内容
正则表达式主要是用来匹配文本中需要查找的内容,例如在一片文章中找出电话号码,就中国的来说11位纯数字(不说座机),则使用"d{11}" 意味匹配数字11次,就能准确的查找出文本中的电话号码. 还有就是在编写网络爬虫的时候需要提取很多超链接再次进行爬取,使用正则表达式就很方便.直接匹配http开头就行,当然也可以使用beautifulsoup的select方法.
看下面的程序看看正则表达提取文本中的邮箱:
w 匹配字母,数字,下划线
+ 匹配1次或者多次
re是正则表达式的工具包,工具包出错的话在anaconda的命令行输入"pip install re"安装,其他的工具包也是如此.
re.compile()中的r示意不是转义字符,也就是保持后面字符串原样,findall返回一个列表.下面还有一个版本的程序略有不同.
compile的另一个参数re.IGONORECASE(忽略大小写),还可以是re.DORALL,多行模式,具体功能也是模糊不清,不过在使用通配符 . 匹配的时候加上re.DOTALL参数能够匹配换行.如果希望忽略大小写和多行模式都开启可以使用re.compile(r'....',re.IGNORECASE|re.DOTALL) .
表达式使用( ),对匹配到的内容分为3组 也就是(w+)出现字母,数字,下划线一次或多次,这个分组就是下面使用match对象的grou()方法的时候的参数.不给参数和参数0都是得到整个匹配到的内容, 参数1得到第一个括号匹配到的内容,以此类推参数2和3,如果没有括号分组的话使用参数会出现错误.
search( )查找和正则式匹配的内容,只匹一次后面的那个找不到.返回一个match对象
w 匹配字母,数字,下划线
W 匹配字母,数字.下划线之外的所有字符
d 匹配数字
D 匹配非数字
s 匹配空格,制表符,换行符
S匹配除空格制表符,换行符之外的其他字符
[ .... ]定义自己的匹配,如[aeiouAEIOU ]匹配所有的元音字母,注意不是匹配单词.
{最少次数,最多次数},例如{3,9} 匹配3-9次,{ ,10}匹配0-10次. 默认为匹配最多次数(贪心匹配),非贪心模式在后面加上问号
? 可选 0次或者1次吧
+匹配1次或多次
*匹配0次或者多次
^ 判断开头 ^d 如果待匹配串是数字开头则返回第一个数字
$判断结尾 d$ 如果待匹配串是数字结尾则返回最后一个数字
. 通配符,匹配除换行之外的所有字符
d{11} 匹配数字11次
. * 匹配所有字符除 换行
[a-zA-Z0-9._%+-] 小写和大写字母、数字、句点、下划线、百分号、加号或短横
[a-zA-Z]{2,4} 匹配字母 2 - 4次
❽ Python中正则表达式的常用元字符有哪些呢
Python 中常用的正则表达式元字符包括:
.:匹配任意一个字符(除了换行符 )。
^:匹配字符串的开头。
$:匹配字符串的结尾。
*:匹配前面的字符 0 次或多次。
+:匹配前面的字符 1 次或多次。
?:匹配前面的字符 0 次或 1 次。
{n}:匹配前面的字符恰好 n 次。
{m,n}:匹配前面的字符至少 m 次,至多 n 次。
[]:匹配方括号内的任意一个字符。
():标记一个子表达式的开始和结束位置。
|:表示或,匹配符号左右两边的任意一个表达式。
:用来转义元字符或者表示特殊字符。
这些耐散元字符在正则表达式晌亩握中经常使用,可以组合成各种复杂的宴庆正则表达式,用于字符串的匹配和替换等操作。
❾ Python常用的正则表达式处理函数详解
正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便。
在Python中,我们通过调用re库来使用re模块:
import re
下面介绍Python常用的正则表达式处理函数。
re.match函数
re.match 函数从字符串的起始位置匹配正则表达式,返回match对象,如果不是起始位置匹配成功的话,match()就返回None。
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式。
string:待匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。具体参数为:
re.I:忽略大小写。
re.L:表示特殊字符集 w, W, , B, s, S 依赖于当前环境。
re.M:多行模式。
re.S:即 . ,并且包括换行符在内的任意字符(. 不包括换行符)。
re.U:表示特殊字符集 w, W, , B, d, D, s, S 依赖于 Unicode 字符属性数据库。
re.X:为了增加可读性,忽略空格和 # 后面的注释。
import re #从起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不从起始位置匹配 r2=re.match('def','abcdefghi') print(r2)运行结果:
其中,span表示匹配成功的整个子串的索引。
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组。
groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
import re s='This is a demo' r1=re.match(r'(.*) is (.*)',s) r2=re.match(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())运行结果:
上述代码中的(.*)和(.*?)表示正则表达式的贪婪匹配与非贪婪匹配。
re.search函数
re.search函数扫描整个字符串并返回第一个成功的匹配,如果匹配成功则返回match对象,否则返回None。
re.search(pattern, string, flags=0)
pattern:匹配的正则表达式。
string:待匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
import re #从起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不从起始位置匹配 r2=re.search('def','abcdefghi') print(r2)运行结果:
使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num=0):匹配的整个表达式的字符串,group() 可以一次输入多个组号,这时它将返回一个包含那些组所对应值的元组。
groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
import re s='This is a demo' r1=re.search(r'(.*) is (.*)',s) r2=re.search(r'(.*) is (.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())运行结果:
从上面不难发现re.match与re.search的区别:re.match只匹配字符串的起始位置,只要起始位置不符合正则表达式就匹配失败,而re.search是匹配整个字符串,直到找到一个匹配为止。
re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式对象,供 match() 和 search() 这两个函数使用。
re.compile(pattern[, flags])
pattern:一个字符串形式的正则表达式。
flags:可选,表示匹配模式,比如忽略大小写,多行模式等。
import re #匹配数字 r=re.compile(r'd+') r1=r.match('This is a demo') r2=r.match('This is 111 and That is 222',0,27) r3=r.match('This is 111 and That is 222',8,27) print(r1) print(r2) print(r3)运行结果:
findall函数
搜索字符串,以列表形式返回正则表达式匹配的所有子串,如果没有找到匹配的,则返回空列表。
需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。
findall(string[, pos[, endpos]])
string:待匹配的字符串。
pos:可选参数,指定字符串的起始位置,默认为0。
endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。
import re #匹配数字 r=re.compile(r'd+') r1=r.findall('This is a demo') r2=r.findall('This is 111 and That is 222',0,11) r3=r.findall('This is 111 and That is 222',0,27) print(r1) print(r2) print(r3)运行结果:
re.finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
pattern:匹配的正则表达式。
string:待匹配的字符串。
flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写,多行匹配等。
import re r=re.finditer(r'd+','This is 111 and That is 222') for i in r: print (i.group())运行结果:
re.split函数
将一个字符串按照正则表达式匹配的子串进行分割后,以列表形式返回。
re.split(pattern, string[, maxsplit=0, flags=0])
pattern:匹配的正则表达式。
string:待匹配的字符串。
maxsplit:分割次数,maxsplit=1分割一次,默认为0,不限次数。
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
import re r1=re.split('W+','This is 111 and That is 222') r2=re.split('W+','This is 111 and That is 222',maxsplit=1) r3=re.split('d+','This is 111 and That is 222') r4=re.split('d+','This is 111 and That is 222',maxsplit=1) print(r1) print(r2) print(r3) print(r4)运行结果:
re.sub函数
re.sub函数用于替换字符串中的匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
pattern:正则中的模式字符串。
repl:替换的字符串,也可为一个函数。
string:要被查找替换的原始字符串。
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配。
import re r='This is 111 and That is 222' # 删除字符串中的数字 r1=re.sub(r'd+','',r) print(r1) # 删除非数字的字符串 r2=re.sub(r'D','',r) print(r2)运行结果:
到此这篇关于Python常用的正则表达式处理函数详解的文章就介绍到这了,希望大家以后多多支持!
❿ Python 中正则表达式全部语法速查
它们不匹配自己,在正则中具有其它的意义,匹配自己需要转义.
元字符的完整列表:
它们不用来代表字符,用来实现一些特殊的匹配功能
可以给 group() , start() , end() , span() 传入参数 分组的序号 ,以获取模式中特定分组匹配到的内容.默认参数为0.
组从0开始从左到右编号,它始终存在.要确定编号,只需计算从左到右的左括号字符.
(?参数)
(?a:表达式)
(?aiLmsux-imsx:表达式)
(?#注释内容)
(?P<组名>表达式) + result.group('组名') :
(?P<组名>表达式) + (?P=<组名>) :
(?:表达式)
(?=表达式)
(?!表达式)
(?<=表达式)
(?<!表达式)
(?(id/name)yes-pattern|no-pattern)
如果你匹配固定字符串或单个字符类,如果你匹配固定字符串或单个字符类,并且你没有使用任何 re 功能,例如 IGNORECASE 标志,那么正则表达式的全部功能可能不是必需的。 字符串有几种方法可以使用固定字符串执行操作,它们通常要快得多,因为实现是一个针对此目的而优化的单个小 C 循环,而不是大型、更通用的正则表达式引擎。
在转向 re 模块之前,请考虑是否可以使用更快更简单的字符串方法解决问题
正则默认是贪婪模式(匹配为尽可能 少 的文字):
非贪婪:匹配为尽可能少的文字
*? 、 +? 、 ?? 、 {m,n}?
使用正则表达式解析 HTML 或 XML 很痛苦。HTML 和 XML 有特殊情况会破坏明显的正则表达式;当你编写正则表达式处理所有可能的情况时,模式将非常复杂。 使用 HTML 或 XML 解析器模块来执行此类任务 。