<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.