文章

re

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 

Your content here

本文由作者按照 CC BY 4.0 进行授权