re
正则表达式
1、re正则的python包
import re
2、正则匹配函数search(r)
search函数传入参数
1、查找参数,可以为正则表达式
2、数据
如果不能够查找,那么返回None
如果可以被查找,.span()可以查看该参数出现的具体位置(起始位置,终止位置+1)
!!!只返回第一个能找到的
3、findall函数
findall函数范围列表,里面包含了匹配了多少个需要匹配的参数
4、[]的使用
[]代表范围,在括号里面的范围都可视为正确
我们可以在范围内标记多个范围
1、[a-z]代表a到z之间所有的小写字母都可以
2、[A-Z]代表A到Z之间所有的大写字母都可以
3、[0-9]代表0-9之间所有的数字都是可以的
所有的范围都可以手动定
如果我们对于-还是想匹配那么需要加上转义符-
!!!如果说我们不想要范围内的字符,那么直接在[后加上^代表取反
5、快捷单词
\w | 与任意单词匹配,仅限于单个字符 |
---|---|
\d | 与任意数字匹配 |
\s | 匹配空白字符,比如空格,换行等 |
\b | 限定开头或者结尾,会自动匹配最近没有\b的字符 |
\W | 非单词字符 |
\D | 非数字字符 |
\S | 非空白字符 |
\B | 不在开头或者结尾 |
1
2
3
4
5
#\b使用
b = re.search(r'\bmaster\b','master')
print(b)
None
#因为第一个\b之前必须要能有一个匹配的字符
1
2
3
a = re.findall(r'\Bmaster\B','masterxiao master xxx master abc') #单词字符后面或前面不与另一个单词字符直接相邻
[]
#并没有一个单词中master在他的内部
6、字符串开始和结束
^ | 代表匹配开头,同时也放在开头 |
---|---|
$ | 代表匹配结尾,同时也放在结尾 |
7、.符号的运用
它代表匹配任何单个字符,不过值得注意的是,它只能出现在方括号字符组以外。
8、{}符号的运用
可以将他带入成一个范围
1、{n}单词放数字,代表执行几次
2、{a,b} a代表下限,b代表上限
3、如果空缺a,那么只有上限,如果空缺b,那么只有下限
1
2
3
4
5
6
7
8
import re
input_str = input()
# 1、基于贪心模式匹配字符串中重复出现2个数字的子字符串,并存储到变量a。
a=re.findall(r'[\d]{2}',input_str)
print(a)
# 2、基于贪心模式匹配字符串中重复出现4-7个数字的子字符串,并存储到变量b。
b=re.findall(r'[\d]{4,7}',input_str)
print(b)
9、?符号的运用
这意味着正则表达式引擎将会期望该字符出现零次或一次。
需要自己给定一个字符,将该字符后放入?
1
2
3
4
5
import re
input_str = input()
# 编写获取she或者he的字符串,并存储到变量a中
a = re.findall(r's?he',input_str)
print(a)
10、+符号的运用
重复匹配1个或多个
需要自己给定一个字符,将该字符后放入+
1
2
3
# 2、匹配字符串中都为数字的子字符串,并存储到变量b。
b=re.findall(r'[\d]+',input_str)
print(b)
11、*符号的运用
重复匹配0个或多个
需要自己给定一个字符,将该字符后放入*
12、分组
findall函数代表我能查询到的所有的集合
如果我想在我能匹配到的内容中再做筛选,那就需要分组
1
2
3
4
5
6
a='<div><a href="https://support.google.com/chrome/?
p=ui_hotword_search" target="_blank">python正则表达式之分组</a>
<p>dfsl</p></div>'
print(re.search(r'<a.*>(.*)</a>',a).group(1))
#我们首先匹配的肯定是r后面的正则表达式
#我们现在想在已经匹配好的里面再进行筛选的话,使用括号,在括号中再进行爬取就行,他在一开始的时候findall还是会存在他的条件,只是方便提取了
分组规则
从正则表达式的左边开始看,看到的第一个左括号
(
表示第一个分组,第二个表示第二个分组,依次类推。!!!
需要注意的是,有一个隐含的全局分组(就是索引号为
0
的分组),就是整个正则表达式匹配的结果。
命名分组规则
命名分组就是给具体有默认分组编号的组另外再起一个别名,方便以后的引用。 命令分组的语法格式如下:
1 (?P<name>正则表达式)
13、先行/后行断言
1、正向先行断言
(?=pattern)
表示正向先行断言,整个括号里的内容(包括括号本身)代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern
。
1
2
3
4
5
6
7
8
9
a = re.findall(r'n(?=al)','final')
b = re.findall(r'n(?=e)','python')
c = re.findall(r'n(?=e)','jasmine')
print(a)
print(b)
print(c)
['n']
[]
['n']
2、反向先行断言
(?!pattern)
表示反向先行断言,与正向先行断言相反,紧接该位置之后的字符序列不能够匹配pattern
。
1
2
3
4
5
6
7
8
9
a = re.findall(r'n(?!e)','final')
b = re.findall(r'n(?!e)','python')
c = re.findall(r'n(?!e)','next')
print(a)
print(b)
print(c)
['n']
['n']
[]
例:
使用正向先行断言获取字符串中以
ing
结尾的字符(不能为空)。
1
2
3
4
import re
a = input()
result=re.findall(r'\b[\w]+(?=ing)',a)
print(result)
正向后发断言
(?<=pattern)
正向后发断言代表字符串中的一个位置,紧接该位置之前的字符序列只能够匹配pattern
。
1
2
3
4
5
6
7
8
9
a = re.findall('(?<=a)n','final')
b = re.findall('(?<=a)n','command')
c = re.findall('(?<=i)n','negative')
print(a)
print(b)
print(c)
[]
['n']
[]
反向后发断言
(?<!pattern)
负向后发断言 代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern
。
1
2
3
4
5
6
7
8
9
a = re.findall('(?<!i)n','final')
b = re.findall('(?<!a)n','command')
c = re.findall('(?<!i)n','negative')
print(a)
print(b)
print(c)
[]
[]
['n']
例子:
使用正向后发断言匹配字符串中以
go
开头的字符的后半部分。
1
2
3
4
import re
a = input()
result = re.findall(r'(?<=go)[\w]+',a)
print(result)
总结
1、如果是先行断言,那么字符应该在判断前
2、如果是后行断言,那么字符应该在判断后
3、正向和反向的区别就是取反,将=变成!
正则表达式标记
1、不区分大小写
re.IGNORECASE
也可以简写为re.I
,使用该标记,可以使正则表达式变为不区分大小写。
1
2
3
4
5
6
a = re.search(r'apple',"THIS IS AN APPLE",re.IGNORECASE)
b = re.search(r'apple','THIS IS AN APPLE',re.I)
print(a)
print(b)
<_sre.SRE_Match object; span=(11, 16), match='APPLE'>
<_sre.SRE_Match object; span=(11, 16), match='APPLE'>
2、点匹配换行符
re.DOTALL
标记(别名为re.S
)可以让.
字符除了匹配其他字符之外,还匹配换行符。
1
2
3
4
5
6
7
8
9
a = re.search(r'.+','hello\npython')
b = re.search(r'.+','hello\npython',re.S)
c = re.search(r'.+','hello\npython',re.DOTALL)
print(a)
print(b)
print(c)
<_sre.SRE_Match object; span=(0, 5),match='hello'>
<_sre.SRE_Match object; span=(0, 12),match='hello\npython'>
<_sre.SRE_Match object; span=(0, 12),match='hello\npython'>
3、多行模式
re.MULTILINE
标记(别名为re.M
)可以匹配多行,使用该标记可以使得仅能够匹配字符串开始与结束的^
与$
字符可以匹配字符串内任意行的开始与结束。
1
2
3
4
5
6
a = re.search(r'^like','foo\nlike')
b = re.search(r'^like','foo\nlike',re.M)
print(a)
print(b)
None
<_sre.SRE_Match object; span=(4, 8), match='like'>
4、如何使用多个标记
1
2
3
#有时候我们可能需要同时使用多个标记,为了完成这点,可以使用|操作符。
#示例:
re.DOTALL|re.MULTILINE 或 re.S | re.M 。