博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
re模块(正则表达式)
阅读量:5159 次
发布时间:2019-06-13

本文共 4508 字,大约阅读时间需要 15 分钟。

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

字符匹配(普通字符,元字符):

1 普通字符:大多数字符和字母都会和自身匹配

              >>> re.findall('alvin','yuanaleSxalexwupeiqi')
                      ['alvin'] 

2 元字符:. ^ $ * + ? { } [ ] | ( ) \

*(星号):--->表示的范围:0到无穷

+(加号)--->表示的范围:1到无穷

?(问号)--->表示的范围:0到1

{},{0, }-->==*

{},{1, }-->==+

{},{0,1}-->?

元字符之. ^ $ * + ? { }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import 
re
 
ret
=
re.findall(
'a..in'
,
'helloalvin'
)
print
(ret)
#['alvin']
 
 
ret
=
re.findall(
'^a...n'
,
'alvinhelloawwwn'
)
print
(ret)
#['alvin']
 
 
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
 
 
ret
=
re.findall(
'a...n$'
,
'alvinhelloawwwn'
)
print
(ret)
#['awwwn']
 
 
ret
=
re.findall(
'abc*'
,
'abcccc'
)
#贪婪匹配[0,+oo]  
print
(ret)
#['abcccc']
 
ret
=
re.findall(
'abc+'
,
'abccc'
)
#[1,+oo]
print
(ret)
#['abccc']
 
ret
=
re.findall(
'abc?'
,
'abccc'
)
#[0,1]
print
(ret)
#['abc']
 
 
ret
=
re.findall(
'abc{1,4}'
,
'abccc'
)
print
(ret)
#['abccc'] 贪婪匹配

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

1
2
ret
=
re.findall(
'abc*?'
,
'abcccccc'
)
print
(ret)
#['ab']

元字符之字符集[]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#--------------------------------------------字符集[]
ret
=
re.findall(
'a[bc]d'
,
'acd'
)
print
(ret)
#['acd']
 
ret
=
re.findall(
'[a-z]'
,
'acd'
)
print
(ret)
#['a', 'c', 'd']
 
ret
=
re.findall(
'[.*+]'
,
'a.cd+'
)
print
(ret)
#['.', '+']
 
#在字符集里有功能的符号: - ^ \
 
ret
=
re.findall(
'[1-9]'
,
'45dha3'
)
print
(ret)
#['4', '5', '3']
 
ret
=
re.findall(
'[^ab]'
,
'45bdha3'
)
print
(ret)
#['4', '5', 'd', 'h', '3']
 
ret
=
re.findall(
'[\d]'
,
'45bdha3'
)
print
(ret)
#['4', '5', '3']

元字符之转义符\

反斜杠后边跟元字符去除特殊功能,比如\.

反斜杠后边跟普通字符实现特殊功能,比如\d

\d  匹配任何十进制数;它相当于类 [0-9]。

\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

1
2
3
4
ret
=
re.findall(
'I\b'
,
'I am LIST'
)
print
(ret)
#[]
ret
=
re.findall(r
'I\b'
,
'I am LIST'
)
print
(ret)
#['I']

现在我们聊一聊\,先看下面两个匹配:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-----------------------------eg1:
import 
re
ret
=
re.findall(
'c\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\l'
,
'abc\le'
)
print
(ret)
#[]
ret
=
re.findall(
'c\\\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
ret
=
re.findall(r
'c\\l'
,
'abc\le'
)
print
(ret)
#['c\\l']
 
#-----------------------------eg2:
#之所以选择\b是因为\b在ASCII表中是有意义的
= 
re.findall(
'\bblow'
'blow'
)
print
(m)
= 
re.findall(r
'\bblow'
'blow'
)
print
(m)

                       

元字符之分组()

1
2
3
4
5
6
= 
re.findall(r
'(ad)+'
'add'
)
print
(m)
 
ret
=
re.search(
'(?P<id>\d{2})/(?P<name>\w{3})'
,
'23/com'
)    #?P-->表示可以给分组内容起个名字,?P<分组名字>,?:表示去除优先级的意思,与分组()一起使用,会去除()的优先级
print
(ret.group())
#23/com
print
(ret.group(
'id'
))
#23

元字符之|

1
2
ret
=
re.search(
'(ab)|\d'
,
'rabhdg8sd'
)
print
(ret.group())
#ab

re模块下的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import 
re
#1
re.findall(
'a'
,
'alvin yuan'
)    
#返回所有满足匹配条件的结果,放在列表里
#2
re.search(
'a'
,
'alvin yuan'
).group()  
#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
                                     
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
 
#3
re.match(
'a'
,
'abc'
).group()     
#同search,不过尽在字符串开始处进行匹配
 
#4
ret
=
re.split(
'[ab]'
,
'abcd'
)     
#先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print
(ret)
#['', '', 'cd']
 
#5
ret
=
re.sub(
'\d'
,
'abc'
,
'alvin5yuan6'
,
1
)
print
(ret)
#alvinabcyuan6
ret
=
re.subn(
'\d'
,
'abc'
,
'alvin5yuan6'
)      #subn()方法:能够按照匹配规则,匹配出内容,并且包含匹配的次数,得到的是两个元素的元组
print
(ret)
#('alvinabcyuanabc', 2)
 
#6
obj
=
re.
compile
(
'\d{3}'
)
ret
=
obj.search(
'abc123eeee'
)
print
(ret.group())
#123
1
2
3
4
5
6
import 
re
ret
=
re.finditer(
'\d'
,
'ds3sy4784a'
)
print
(ret)        
#<callable_iterator object at 0x10195f940>
 
print
(
next
(ret).group())
print
(
next
(ret).group())

注意:

1
2
3
4
5
6
7
import 
re
 
ret
=
re.findall(
'www.(baidu|oldboy).com'
,
'www.oldboy.com'
)
print
(ret)
#['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可,?:是去除()的优先级,与分组元字符()一起使用
 
ret
=
re.findall(
'www.(?:baidu|oldboy).com'
,
'www.oldboy.com'
)
print
(ret)
#['www.oldboy.com']

补充:

import reprint(re.findall("<(?P
\w+)>\w+
","

hello

"))print(re.search("<(?P
\w+)>\w+
","

hello

"))print(re.search(r"<(\w+)>\w+
","

hello

"))

补充2

#匹配出所有的整数import re#ret=re.findall(r"\d+{0}]","1-2*(60+(-40.35/5)-(-4*3))")ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")ret.remove("")print(ret)

转载于:https://www.cnblogs.com/zhangshuaihui/p/10327814.html

你可能感兴趣的文章
Program exited with code **** 相关解释
查看>>
植物大战僵尸中文年度版
查看>>
26、linux 几个C函数,nanosleep,lstat,unlink
查看>>
投标项目的脚本练习2
查看>>
201521123107 《Java程序设计》第9周学习总结
查看>>
Caroline--chochukmo
查看>>
iOS之文本属性Attributes的使用
查看>>
从.Net版本演变看String和StringBuilder性能之争
查看>>
Excel操作 Microsoft.Office.Interop.Excel.dll的使用
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
【bzoj2788】Festival
查看>>
执行gem install dryrun错误
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>