python中的RE模块

时间:2022-02-04 02:24:45

re模块(* * * * *)

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

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

1 普通字符:大多数字符和字母都会和自身匹配
              >>> re.findall('alvin','yuanaleSxalexwupeiqi')
                      ['alvin'] 

2 元字符:.(匹配所有)

^只(从头开始匹配)

$(必须在最后匹配)

*(重复匹配)(0到无穷)

 n2="kuisddddss"

>>> re.findall('d*',n2)
['', '', '', '', 'dddd', '', '', '']

 

>>> n3="asdhfale"
>>> re.findall("alex*",n3)
['ale']

+(重复匹配)(1到无穷)

>>> n3="asdhfale"

>>> re.findall("alex+",n3)
[]

?(重复匹配)(0或1次)

 n4 =  "asdhfale"

>>> re.findall("alex?",n4)
['ale']

n5=  "asdhfalexxxxx"

>>> re.findall("alex?",n5)
['alex']

{ }自定义次数,如{0,}=*,{6}固定6次,{0,6}0到6次

[ ]或 比如x[yz] 匹配xy或xz  其它符号在[ ] 中皆为普通字符。除了-,比如[a-z]匹配a到z,和^比如[^a-z]匹配非a到z,和\转义符,比如\(\)

|或,比如ka|b,匹配ka或b

re.match类似serach加一个^

sub:替换,subn,结果显示替换次数

>>> re.sub(r"\d","a"," ki88s1i")
' kiaasai'

>>> re.subn(r"\d","a"," ki88s1i")
(' kiaasai', 3)

compile编辑规则

ssa=re.compile("\d+")

>>> ssa.findall("sdii888")
['888']

去优先级:

比如:(findall优先匹配组里的信息)

re.findall(r'www\.(baidu|3dm)\.com',"www.3dm.com")
['3dm']

去优先级:?:

>>> re.findall(r'www\.(?: baidu|3dm)\.com',"www.3dm.com")
['www.3dm.com']

再如

 >>> re.findall(r'(abc)+',"abcabcabc")

['abc']

如何取出全部呢?依然是去优先级

>>> re.findall(r'(abc)+',"abcabcabc")
['abc']

 

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

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)

                     python中的RE模块  

元字符之分组()

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' )
print (ret.group()) #23/com
print (ret.group( 'id' )) #23

元字符之|

 

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)

                     python中的RE模块  

元字符之分组()

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' )
print (ret.group()) #23/com
print (ret.group( 'id' )) #23