python学习笔记(1)正则表达式

 搜索和匹配的比较:
        匹配(matching)指的是术语模式匹配(pattern-matching)。在python术语中,有两种方法来完成模式匹配。搜索(searching):是指在字符串中的任意位置搜索匹配的模式;而匹配(matching)是指判断一个字符串是否能从开始处全部部分地匹配某个模式。当涉及模式时,全部使用术语匹配,我们根据python如何完成模式匹配的方式来区分搜索和匹配。
   简言之,匹配是试图在字符串的开始位置匹配,而搜索是指试图从字符串的任何位置开始匹配。
 
    eg:
>>> re.search('wen','daiwenhai')
<_sre.SRE_Match object; span=(3, 6), match='wen'>
>>> re.match('wen','daiwenhai')
>>> re.match('dai','daiwenhai')
<_sre.SRE_Match object; span=(0, 3), match='dai'>
>>> re.match('hai','daiwenhai')
>>> 

   

  • “.”匹配任何字符串(除了\n外)
>>> re.match('f.o','f9of23o')
<_sre.SRE_Match object; span=(0, 3), match='f9o'>
>>> re.match('f.o','f9of2o')
<_sre.SRE_Match object; span=(0, 3), match='f9o'>
   要显示的匹配一个句点本身,必须使用反斜线转移句点符号的功能

  • “^”匹配任何字符串起始部分
>>> re.match('^代','代文海')
<_sre.SRE_Match object; span=(0, 1), match='代'>
>>> re.match('^代.*','代文海')
<_sre.SRE_Match object; span=(0, 3), match='代文海'>
  

  • “$”匹配符串终止部分
>>> re.match('.*?海$','代文海')
<_sre.SRE_Match object; span=(0, 3), match='代文海'>
>>> re.match('.*?海12$','代文海')
>>> 
  

  • 用*表示任意个字符(包括0个),用+表示至少一个字符,用表示0个或1个字符,用{N}表示n个字符,用{N,M}表示n-m个字符,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符,可以通过加?变成非贪婪匹配。
>>> re.match('\d{2,5}','12345kk')
<_sre.SRE_Match object; span=(0, 5), match='12345'>
>>> re.match('.*?\d{2,5}','dddd12345kk')
<_sre.SRE_Match object; span=(0, 9), match='dddd12345'>

  • python正则表达式特殊字符\d匹配任何十进制数字,与[0-9]意思相同,而\D匹配任何非十进制数字,正好和\d相反。
  • \w匹配任何的数字或者字母,与[A-Za-z0-9]相同,而\W和\w正好相反,匹配的是任何非数字或者字母。
  • \s匹配任何的空格字符,与[\n\t\r\f\v]相同,\S和正好相反(\n:换行,光标到下行行首;\t:tab,水平制表;\r:回车,移动光标到本行行首;\f:换页;\v垂直制表)。
  • \b匹配任何单词边界,\B与之相反。
  • \A相当于^,\Z相当于$(主要用于有些没有脱字符的键盘)。
>>> re.search(r'\bthe\b','the 123')
<_sre.SRE_Match object; span=(0, 3), match='the'>
>>> re.search('\bthe\b','the123')
>>> re.search(r'the\b','the 123')
<_sre.SRE_Match object; span=(0, 3), match='the'>
>>> re.search(r'the\b','the123')
>>> re.match('.*\$$','123$')
<_sre.SRE_Match object; span=(0, 4), match='123$'>
>>> re.match('.*\$$','123$12')
>>> re.match('\$$','123$')
>>> re.search('\$$','123$')
<_sre.SRE_Match object; span=(3, 4), match='$'>
 
     
    

  • 如果脱字符(^)紧跟在方括号后面,就表示不匹配给定字符集中的任何一个字符。
 
z.[0-9] //匹配字母z后面紧跟一个任意字符,然后跟一个数字
[^0-9] //匹配任何一个非数字字符
[''-,a]  //匹配所有ascii值小于等于a的字符

  • 我们可以使用圆括号指定分组,通过用圆括号包裹任何的正则表达式来实现。
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
>>> 

python re模块的核心函数和方法

compile(pattern,flangs=0)使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象。
match(pattern,string,flangs=0)用正则表达式去匹配对象,如果匹配成功返回匹配对象,匹配失败返回None。
search(pattern,string,flags=0)搜索字符串中第一次出现的正则表达式模式,成功则返回匹配对象。
findall(pattern,string)查找字符串中出现的所有正则表达式模式,返回一个匹配列表。
finditer(pattern,string)与findall函数相同,但返回的是一个迭代器,对于每一次的匹配,迭代器都返回一个匹配对象。
splite(pattern,string,max=0)根据给定的格式将字符串分割成子部分,然后返回成功匹配的列表,分割最多操作max次(默认分割所有匹配成功的位置。
sub(pattern,repl,string,count=0)使用repl替换所有匹配到的模式的部分,然后返回匹配成功的列表,最多替换count次,默认替换所有。
group(num=0)返回整个匹配对象,或者编号为num的子组。
groups()返回匹配成功所有匹配子组的一个元组。
groupdict()返回包含匹配成功的所有匹配子组的一个字典。

常用的模块属性
re.I,re.IGNORECASE 不区分大小写的匹配。
re.M,re.MULTILINE^和$分别匹配目标字符串中行的开始和结尾,而不是严格匹配整个字符串本身的开始和结尾。
re.S,rer.DOTALL点号通常匹配除了\n外的之外的所有单个字符,加了该标记表示能够匹配全部字符。

编译正则表达式

在模式匹配发生之前,正则表达式必须要先编译成正则表达式对象,所以在多次使用同一模式时,最好先进行正则表达式预编译来提升性能。re.compile()。模块函数会对预编译过的正则表达式进行缓存,purge()可以用来清除缓存。
>>> m=re.match('(\w\w\w)-(\d\d\d)','abc-123')
>>> m
<_sre.SRE_Match object; span=(0, 7), match='abc-123'>
>>> m.group()
'abc-123'
>>> m.group(1)
'abc'
>>> m.group(2)
'123'
>>> m.groups()
('abc', '123')
>>> 
group()通常以普通的方式显示所有匹配的部分,也可以通过加参数显示各个匹配子组(从1开始而不是从0开始),groups()获取一个包含所有匹配字串的元组。
>>> it=re.findall(r'(th\w+)',s,re.I)
>>> it
['This', 'that']
>>> s='This is that'
>>> it=re.finditer(r'(th\w+)',s,re.I)
>>> g=it.__next__()
>>> g.groups()
('This',)
>>> g.group()
'This'
>>> g.group(1)
'This'
>>> g.group(2)
Traceback (most recent call last):
  File "", line 1, in 
    g.group(2)
IndexError: no such group
>>> g=it.__next__()
>>> g.group()
'that'
>>> g.group(2)
Traceback (most recent call last):
  File "", line 1, in 
    g.group(2)
IndexError: no such group
>>> g.group(1)
'that'
>>> [g.group(1) for g in re.finditer(r'(th\w+)',s,re.I)]
['This', 'that']
>>> 

使用sub()和subn()进行所搜和替换

sub()和subn()实现的功能相同,都是将所有匹配正则表达式的部分替换为特定的形式替换,用来替换的部分可以是一个正则表达式也可以是一个函数。subn()还会返回一个替换的总次数,和替换后的字符串一起构成一个元组返回。
>>> re.sub('[ae]','X','abcdef')
'XbcdXf'
>>> re.subn('[ae]','X','abcdef')
('XbcdXf', 2)
>>> re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})',r'\2/\1/\3','2/20/91')
'20/2/91'
>>> re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})',r'\3/\1/\2','2/20/91')    //'\'+数字表示第几个子组
'91/2/20'
>>> 

为了防止ascii字符和正则表达式特殊字符之间存在的冲突,最好使用原始字符串,例如在python正则表达式中使用\b就会被正则表达式编译器解释成退格符,只有\\b才能被解释成边界匹配,但如果写r'\b'就会直接解释成边界匹配符。





你可能感兴趣的:(python)