python正则表达式
1、什么是python正则表达式
正则表达式是进行文本匹配的一种方式,通过正则来匹配到自己需要的内容。和我们用搜索浏览器一样,搜索abc,搜索出来的内容就是包括abc相关的。
正则是在一个目标字符串中,搜索到你需要的关键字
- 目标字符串: Youth is not a time of life; it is a state of mind
- 正则表达式: mind
下面这个网站就是可以使用正则来匹配搜索。
https://tool.oschina.net/regex/
2、常用的python正则表达式
. 匹配除换行符以外的任意字符
\b 匹配字符串中的单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
\w 匹配字母或数字
\s 匹配任意的空白符
\d 匹配数字
2.1详细介绍如下
-
1、 比如 \bm…e\b
-
2、 \w 匹配字母或数字
\b\w\w\w\w\b 代表什么 ?\w 匹配字母或数字 ,所以上面的是开头到结尾,一共4个。都是数字和字母。
-
3、 \s 匹配任意的空白符
空白符包括空格,制表符(tab),换行符这三个很特殊的字符 , 通过and\smade 可以匹配到and made
- 4、 ^ 和 $ 匹配字符串开始和结束
只想验证字符串是不是以ma开头,那么可以通过^ma 来验证
值得注意的是,如果是[^a]
这种形式, ^
表示否,[^a]
表示匹配不是a的任意一个字符
3、常用的python正则表达式 ----数量相关
3.1 \b\w*a\w*\b
的匹配
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
\b\wa\w\b w*表示 0个或多个字母或数字。 所以整个的意思就是, 找个单词,中间是a就行了。
3.2 \d+ 的匹配
+ 表示重复1次或更多次
\d+ \d 表示数字,+ 表示重复1次或多次
3.3 (\+86)?\d{11}
的匹配
(\+86)?\d{11} 是匹配我们的手机号码的
- 理解这个需要知道下面三个点
-
1、转义字符
- 比如 + 表示重复1次或更多次,如果想要匹配的字符里本身就有+ 该怎么办呢?
- 使用 \ 转义 + , 这个时候+ 就是+,没有别的意思。
-
2、分组
- 前面说重复,都是重复某一个字符,但是如果想要让一个字符串重复呢,就如本题中的+86,它作为一个整体重复0次或1次,就需要用小括号把+86括起来,(+86) 就变成了一个分组,也叫子表达式,在使用正则表达式匹配时,这些分组的部分如果被匹配上,可以获得字符串中匹配的字符串。
-
3、重复指定次数
- *重复0次或更多次
- +重复1次或更多次
- ?重复0次或1次
-
即这个正则表达式 (\+86)?\d{11}
可以被拆分为几个部分来解析其意义:
-
1、
(\+86)?
:
+:匹配一个加号字符(在正则表达式中,+ 是一个特殊字符,表示前面的字符或组的一个或多个重复,所以要在前面加上 \ 进行转义以匹配实际的加号字符)。86:匹配数字“86”。
?:表示前面的部分(即 +86)是可选的,可以出现一次或不出现。 -
2、
\d{11}
:
\d:匹配任何数字字符,相当于 [0-9]。
{11}:表示前面的 \d 必须恰好重复11次。
所以,整个正则表达式 (+86)?\d{11} 的意义是:
匹配一个由11位数字组成的字符串,该字符串前面可能(也可能不)有一个加号和一个“86”。
4. 重复指定次数
- {n} 表示重复n次
- {n,} 表示n次或更多次,换一个说法就是至少重复n次
- {n, m} 表示重复n到m次,换一个说法就是至少重复n次,最多重复m次
5.重复的量词的含义
将这些量词分为两部分,一部分是有{}的,一部分是没有{},先说有{}符号的
- 规定重复次数的 {n}
- 规定重复次数下限的 {n, }
- 规定重复次数下限和上限的 {n, m}
再来看 * + ?
* 表示0次或多次,和Linux中类似。
+ 是在* 的基础上加1,就变成了1次或多次
? 表示不清楚,所以是0次或者1次。
6. 正则表达式转义,替换
1. 字符转义
-
如果正则表达式想要匹配的字符恰好是特殊代码,或者重复量词等其他正则表达式里用于描述规则的字符,那么就需要使用字符转义。
-
比如你想匹配+ 或者 ?,那么你要在正则表达式里写成
\+
和\?
这样,他们就代表字符加号和问号,而不是重复几次,如果想匹配\, 则写成\\
。
2. 替换
- | 匹配左右任意一个表达式,可以表示或的意思。
\bthis\b|\bbook\b
表示 匹配得上this,或者匹配得上book
3. 使用[] 指定一个字符范围
- 特殊代码. \w \s \d 所指定的字符,范围太大了,不够灵活,比如我只想匹配0到5 这个范围内的数字,使用\d就不行了,虽然可以写成 0|1|2|3|4|5 ,但使用起来不够方便,对于这种情况,就可以使用中括号
- [0-5] 表示从0到5的字符
- [a-z] 表示从a到z的字符
- [a-zA-Z0-5] 多个范围
- [+?] 表示+ 或者 ? 在中括号里,特殊字符可以不使用字符转义
7. python中怎么使用正则
- 1、re模块的使用------match
功能: match方法的作用是从字符串起始位置开始匹配一个模式,如果模式不匹配,则返回None
import re
res = re.match('www', 'www.coolpython.net')
if not res is None:
print(res.span()) # 输出匹配的起始位置和结束位置
print(res)
- 2、re模块的使用------search
search
功能:按照需求,在整个字符串中查找,而不一定是从开头
需求:匹配出文章阅读的次数
import re
ret = re.search("\d+", "阅读次数为 9999")
if ret:
print(ret.group()) # 如果找到了匹配项,则打印它
else:
print("没有找到数字序列")
#运行结果: 9999
7. 正则表达式实践
7.1匹配URL [a-zA-z]+://[^\s]*
-
1、
[a-zA-z]+
[a-zA-z]+
这部分匹配一个或多个(由于 +)小写或大写英文字母。这通常用于匹配URL的协议部分,如 http, https, ftp 等。
-
2、
:// 这部分直接匹配URL中的 :// 字符串
-
3、
[^\s]
-
[^\s]
这个字符类匹配任何不是空白字符(\s 代表空白字符,如空格、制表符、换行符等)的字符。^ 在这里是一个否定符号。 -
*
这个量词表示前面的字符类([^\s])可以出现零次或多次。
-
7.2 匹配.com的邮箱
-
^[a-zA-Z0-9_-]+@[a-z0-9]+.com$
-
先考虑规则,邮箱分为两部分,A@B,A部分是邮箱用户名部分,可以由大小写字母,数字,下划线,中划线构成。
-
B是域名部分,域名通常都是xxx.xxx的形式,那么根据实际工作中的需要,可以继续细化,域名的前半部分只能由小写字母和数字构成,后半部分只能是com,根据这些规则写出正则表达式
解释如下:
-
1、 ^: 这是正则表达式的开始锚点,它确保整个字符串的开始与接下来的模式匹配。
-
2、
[a-zA-Z0-9_-]+
:-
[a-zA-Z0-9_-]
: 这是一个字符集,它匹配任何小写字母、大写字母、数字、下划线(_)或连字符(-)。 -
+: 表示前面的字符集(即 [a-zA-Z0-9_-])必须出现一次或多次。因此,这部分匹配电子邮件地址的用户名- 部分(在 @ 之前的部分)。
-
-
3、@: 匹配文字字符 @。
-
4、
[a-z0-9]+
:[a-z0-9]
: 这是一个字符集,它匹配任何小写字母或数字。- +: 表示前面的字符集(即
[a-z0-9]
)必须出现一次或多次。这部分匹配电子邮件地址的域名部分(在 @ 之后的部分),但请注意,它只接受小写字母和数字,并且没有点(.)来分隔子域名。
-
5、 .com: 匹配文字字符 .com。这部分是电子邮件地址的顶级域名(TLD),如果是别的,就可以换成别的
-
6、$: 这是正则表达式的结束锚点,它确保整个字符串的结束与前面的模式匹配。
8. python 正则中r的作用
-
在Python中,字符串中的反斜杠(\)是一个特殊字符,它用于表示转义序列,如\n(换行)、\t(制表符)等。但是,在正则表达式中,我们经常需要使用到反斜杠,比如\d(匹配任何数字)、\s(匹配任何空白字符)等 ,如果没有r前缀,我们需要为每个反斜杠写两个反斜杠(\)来避免Python解释器将其视为转义字符。但这样做会使正则表达式变得难以阅读和编写。
-
使用r前缀,就可以直接写出你想要的正则表达式,而无需担心Python解释器会将其中的反斜杠视为转义字符。
-
8.1 不使用 r 前缀
import re
pattern = '\\d+' # 匹配一个或多个数字
match = re.search(pattern, 'abc123def')
if match:
print(match.group()) # 输出: 123
- 8.2 如果使用r前缀的话
import re
pattern = r'\d+' # 匹配一个或多个数字
match = re.search(pattern, 'abc123def')
if match:
print(match.group()) # 输出: 123
由于使用了r前缀,我们可以直接写出\d+而无需担心Python解释器会误解它。这使得正则表达式更加清晰和易于编写。