正则

常用元字符
代码说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
常用限定符
代码/语法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
常用反义词
代码/语法说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

python正则表达式匹配字符串相关方法

一、匹配方法简要介绍及注意事项

1.贪婪匹配与非贪婪匹配

在定义用于匹配的模式串时,我们知道“.*”和“.*?”分别代表“匹配任意字符0次或多次”和“匹配任意字符0次或1次”。如果使用“.*”,则为贪婪匹配;如果使用“.*?”,则为非贪婪匹配。

#  以abcdbcd为例
str_demo = 'abcdbcd'
result = re.search('b.*d', str_demo).group()
print(result)
## 输出bcdbcd
result = re.search('b.*?d', str_demo).group()
print(result)
## 输出bcd

2.findall与search的选取问题

如果认为自己定义的模式串只能匹配到一个结果,则使用search方法结合group方法可以直接得到这个字符串;如果认为自己定义的模式串能匹配到多个结果,则使用findall方法可以得到存储多个结果字符串的列表。

#  以abcdbcd为例
str_demo = 'abcdbcd'
result = re.search('b.*d', str_demo).group()
print(result)
## 输出bcdbcd
result = re.findall('b.*?d', str_demo)
print(result)
## 输出['bcd', 'bcd']

3.匹配时"()"和“[]”的用法

目标字符串:‘abcde’
1.[…] 会匹配在[]内的任意一个字符,而不会匹配整个字符串。

str_demo = 'eabceaebece'
result = re.findall('[abc]', str_demo)
print(result)
##  结果为['a', 'b', 'c', 'a', 'b', 'c']
result = re.findall('[abc][e]', str_demo)
print(result)
##  结果为['ce', 'ae', 'be', 'ce']
result = re.findall('[abc].*?[e]', str_demo)
print(result)
##  结果为['abce', 'ae', 'be', 'ce']
result = re.findall('[abc].*[e]', str_demo)
print(result)
##  结果为['abceaebece']

2.(…)会匹配在()内的整个字符串。使用search方法时则正常匹配(相当于没有()),使用findall方法时则只会匹配(…)的内容。

str_demo = 'eabcdeeaebece'
result = re.search('(abc).*?(e)', str_demo).group()
print(result)
##  结果为abcde
result = re.search('(abc).*(e)', str_demo).group()
print(result)
##  结果为abcdeeaebece
result = re.findall('(bc).*(e)', str_demo)
print(result)
##  结果为[('bc', 'e')]

3.()[]同时出现,考虑(…)式的字符串与[…]式内的字符和顺序,使用findall 方法时结果会舍弃[…]内容,使用search方法时则正常匹配(相当于没有()和[])。

str_demo = 'eabcdeeaebece'
result = re.findall('(e)[abc]', str_demo)
print(result)
##  结果为['e', 'e', 'e', 'e']
result = re.findall('(abc)[e]', str_demo)
print(result)
##  结果为[]
result = re.findall('(abc).*[e]', str_demo)
print(result)
##  结果为['abc']
result = re.findall('[abc].*(e)', str_demo)
print(result)
##  结果为['e']
result = re.search('[bc].*(e)', str_demo).group()
print(result)
##  结果为##  结果为bcdeeaebece
result = re.search('[bc].*?(e)', str_demo).group()
print(result)
##  结果为##  结果为bcde

4.使用正则表达式匹配字符串的例子

下列例子均使用非贪婪匹配方法。

(1)匹配以a开头,以b为结尾的字符串(不包含开头和结尾):

str_demo = 'acdbcd'
pattern = re.compile('(?<=a).*?(?=b)')
result = pattern.search(str_demo).group()
print(result)
## 输出cd

(2)匹配以a开头,以b结尾的字符串(包含开头和结尾):

str_demo = 'acdbcd'
pattern = re.compile('a.*?b')
result = pattern.search(str_demo).group()
print(result)
## 输出acdb

(3)匹配前面不为a、后面不为b的字串:

str_demo = 'a1***3***3b'
pattern = re.compile('(?!<a)1.*3(?!b)')
result = pattern.search(str_demo).group()
print(result)
## 输出1***3

二、相关函数简要介绍

re.compile函数

re.compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 、 search() 和 findall() 这三个函数使用。

re.compile(pattern[, flags])
参数描述
pattern 匹配的正则表达式。
flags 可选参数,标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。

re.match函数

re.match 尝试从目标字符串的起始位置匹配,如果起始位置匹配不成功,则match()就返回none。

re.match(pattern, string, flags=0)
参数描述
pattern 匹配的正则表达式。
string 要匹配的字符串。
flags 可选参数,标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。

re.search函数

re.search 扫描整个字符串并返回第一个成功的匹配。

re.search(pattern, string, flags=0)
参数描述
pattern 匹配的正则表达式。
string 要匹配的字符串。
flags 可选参数,标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。

findall函数

findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

findall(string[, pos[, endpos]])
pattern.findall(string[, pos[, endpos]])  #  pattern及定义好的正则匹配式,如re.compile
re.findall(pattern,string[, pos[, endpos]])
参数描述
string 要匹配的字符串。
pos 可选参数,指定字符串的起始位置,默认为 0。
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

re.finditer函数

re.finditer 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)
参数描述
pattern 匹配的正则表达式。
string 要匹配的字符串。
flags 可选参数,标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。

re.sub函数

re.sub 用于替换字符串中的匹配项。

re.sub(pattern, repl, string, count=0, flags=0)
参数描述
pattern 匹配的正则表达式
repl 替换用的字符串,也可为一个函数。
string 要匹配的字符串。
count 可选参数,匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags 可选参数,标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。

其他函数

菜鸟教程链接: python正则表达式
正则表达式特殊符号用法链接:特殊符号
其他教程:详情

 

原文链接:https://blog.csdn.net/K837871735/article/details/117598000

posted @ 2018-09-05 09:46  笑而不语心自闲  阅读(99)  评论(0编辑  收藏  举报