首页 > 代码库 > <Python高级全栈开发工程师-1>学习过程笔记【181-184】正则表达式 <特殊字符><函数>

<Python高级全栈开发工程师-1>学习过程笔记【181-184】正则表达式 <特殊字符><函数>

1.头文件

import re

2.re.findall("stra","strb",匹配模式)  在strb中找stra,返回一个列表,列表中为所有的匹配内容

>>> re.findall("juruo","iamjuruoiamnotjuruo")
[juruo, juruo]
>>> re.findall("juruo","iamyzw")
[]
>>> re.search("ab","cdabcd")
<_sre.SRE_Match object; span=(2, 4), match=ab>
>>> re.search("ab","cdabcd").group()
ab

 

2re.search("stra","strb",匹配模式)  匹配一次,返回一个search对象

>>> re.search("ab+","abab")
<_sre.SRE_Match object; span=(0, 2), match=ab>

 

3re.match("strb","stra",[匹配模式]) 匹配一次,且只对开头进行匹配,返回一个match对象

>>> re.match("abc","abcde")
<_sre.SRE_Match object; span=(0, 3), match=abc> 
>>> re.match("bcd","abcd") #匹配不成功返回空

 search match findall的匹配模式:

re.I 不区分大小写

>>> re.search("AB","12ab",re.I).group()
ab
>>> re.match("abc","ABC",re.I).group()
ABC
>>> re.findall("ab","abAB",re.I)
[ab, AB]

re.S 使.匹配包括换行符在内的所有字符

>>> re.search(".","\n",re.S).group()
\n
>>> re.match("abc.","abc\n").group()
Traceback (most recent call last):
  File "<pyshell#75>", line 1, in <module>
    re.match("abc.","abc\n").group()
AttributeError: NoneType object has no attribute group‘  (报错)
>>> re.match("abc.","abc\n",re.S).group()
abc\n
>>> re.findall(".","abc\n",re.S)
[a, b, c, \n]

 

4.

rearch,match对象的方法

group(【参数】) 返回匹配的字符串

start() 返回匹配开始的位置

end() 返回匹配结束的位置

span() 返回一个元组包含匹配(开始,结束)的位置
groups() 举个栗子说明
>>> re.search("a","bac").group()
a
>>> re.search("a","bac").start()#左闭
1
>>> re.search("a","bac").end()  #右开
2
>>> re.search("a","bac").span() #左闭右开
(1, 2)
>>> re.match("a","abc").group()
a
>>> re.match("a","abc").start()  #左闭
0
>>> re.match("a","abc").end()    #右开
1
>>> re.match("a","abc").span()   #左闭右开
(0, 1)

group()

>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group()  #默认为0
12abcABCD
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(0)   #所有匹配的内容
12abcABCD
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1)   #返回其中第一组匹配的内容
12
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2)   #返回其中第二组匹配的内容
abc
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(3)    #返回其中第三组匹配的内容
ABCD
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2)  #返回其中第一二组匹配的内容
(12, abc)
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2,3)  #返回其中第一二三组匹配的内容
(12, abc, ABCD)
>>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2,3)   #返回其中第二三组匹配的内容
(abc, ABCD)

 

5 sub()  替换 re.sub("旧的","新的","str",[次数])  次数可以省略,不写时表示替换所有

>>> re.sub("g.t","have","I get A ,I got B, I gut C")
I have A ,I have B, I have C
>>> re.sub("g.t","have","I get A ,I got B, I gut C",1)
I have A ,I got B, I gut C
>>> re.sub("g.t","have","I get A ,I got B, I gut C",2)
I have A ,I have B, I gut C
>>> re.sub("g.t","have","I get A ,I got B, I gut C",3)
I have A ,I have B, I have C

 

6.subn 替换,并返回替换的次数 re.sub("旧的","新的","str",[次数]) 不写次数表示替换所有

>>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo")
(I am yzw.My QQname is yzw,My csdn naame is yzw, 3)
>>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo",2)
(I am yzw.My QQname is yzw,My csdn naame is juruo, 2)

 

7.compile 把正则表达式规(stra)则编成一个对象,这样可以重复利用  re.compile("正则表达式规则")

>>> a=re.compile("b.c")
>>> re.findall(a,"bac")
[bac]
>>> a.findall("bac")  #也可以用生成的对象来调用finall方法,实际上a是在re上封装了这个规则..所以可以用findall
[bac]

 

8.split分割   splirt("规则","str")

>>> re.split("\\d+","ab1ab2ab")
[ab, ab, ab]
>>> a=re.compile("\\d+")  #将正则表达式规则封装成对象a 
>>> re.split(a,"ab1ab2ab")  #使用对象a作为规则
[ab, ab, ab]
>>> a.split("ab1ab2ab")    #a实际上是在re中封装规则得到的,所以可以使用split
[ab, ab, ab]
>>> re.split("[ab]","cacbc")  
[c, c, c]

 

5.二元字符 (11个)

. ^  $ * + ?  {} [] | () \

【.】通配符 匹配一个除了换行符外的任何字符

【^】  re.finadall("^stra","strb")如果stra在strb的开头位置,则匹配成功

例子: 

>>> re.findall("^123","123456")
[123]
>>> re.findall("^123","4123")
[]

【$】 re.findall("stra$",strb"") 如果stra在strb的末尾则匹配成功

例子:

>>> re.findall("456$","123456")
[‘456‘]

【* 】重复到多次   (这是一种贪婪匹配)

>>> re.findall("abc*","abc")
[abc]
>>> re.findall("abc*","abcccccc")   #贪婪匹配:它会匹配c最多的那个
[abcccccc]

【+】 重复1到多次

>>> re.findall("ax+","axxxx")
[axxxx]

【?】 重复0次或1次

>>> re.findall("ax?","a")
[a]
>>> re.findall("ax?","ax")
[ax]
>>> re.findall("ax?","axx")
[ax]

【{}】重复指定次数   {x}重复x次  {a,b} 匹配[a,b]次(闭区间)

>>> re.findall("ax{3}","axxxxxx")
[axxx]
>>> re.findall("ax{0,3}","aaxaxxaxxx")
[a, ax, axx, axxx]

【\】 

\后面跟元字符(正则表达式特殊字符),会去除它们的特殊功能

\\引用序号对应字组所匹配的字符串

>>> re.search("(abc)(def)\\1","abcdefabc").group()   #这里(abc)是第1组 d(ef)是第2组
abcdefabc
>>> re.search("(abc)(def)\\2","abcdefdef").group()
abcdefdef

 

\d 匹配【0,9】闭区间

\D 匹配任何非数字字符 相当于[^0-9]

\s匹配任何空白字符  相当于:\n \t 空格  \r \f \v

\S匹配任何非空白字符

\w匹配任何字母数字字符 相当于【a-z】并【A-Z】并【0-9】

\W匹配任何非字母数字字符

\b匹配一个单词的边界,其实是匹配字符和空格之间的位置

就是在你匹配单个单词的时候,如果不是单个单词就不匹配

例如:匹配I的时候有很多单词中都有I 但我指向匹配单个I 

>>> re.search("\\bI\\b","IBIc I ").group()
I

 

【[]】 其中的一个字符 [abcdef]匹配其中的一个字符  re.findall("[stra]","strb") 一个一个字符的遍历字符串strb,然后和stra的字符进行匹配

>>> re.findall("[abcdef]haha","ahaha")
[ahaha]
>>> re.findall("[abcdef]haha","abhaha")
[bhaha]

[]中的(元字符)特殊字符全部变成普通字符

>>> re.findall("a[.]b","aab")
[] #没有起到通配符的作用
>>> re.findall("a[.]b","a.b")  #和.匹配
[a.b]

[]中-起到至的作用

>>> re.findall("[a-z]","abcdefg")#一个一个字符遍历"abcdefg"进行匹配

[a, b, c, d, e, f, g]
>>> re.findall("[0-9]","0123456789") 
[
0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[]中^起到非的作用  [^1-9]除了1到9的数字都被匹配

>>> re.findall("[^1-9]","12345abc")
[a, b, c]

【()】作为一个整体进行处理

【|】或

 6.非贪婪

从前面看 ? + *都是贪婪匹配

首先看贪婪模式

>>> re.search("a\d+","a23b")
<_sre.SRE_Match object; span=(0, 3), match=a23>
>>> re.search("a\d+","a23b").group()
a23
>>> re.search("a\d+","a2312345").group()
a2312345

非贪婪模式

>>> re.search("a\d+?","a2312345").group()
a2
>>> re.search("a\d*?","a2312345").group()
a

注意有这种特殊情况:

需要费贪婪匹配的东西夹在中间是不行的,会匹配所有的

>>> re.search("a(\d+?)b","a23b").group()
a23b

7.

 

<Python高级全栈开发工程师-1>学习过程笔记【181-184】正则表达式 <特殊字符><函数>