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

 

posted on 2017-08-14 02:10  我是蒟蒻  阅读(165)  评论(0编辑  收藏  举报

导航