Python正则表达式与re模块介绍(3)

>>> re.match(r'(abc)ee\1','abceeabc') #match匹配则会有一个match对象返回。
<_sre.SRE_Match object at 0x00000000055F9BE8>
>>> re.match(r'(abc)ee\1','abceeabd') #match不匹配,则返回None。
>>>

(5)(?P=name) 使用别名为name的分组匹配到的字符串。通常与(?P<name>...)结合使用。用法同\<number>。假设表达式为(?P<Year>\d{4})(?P=Year)。则匹配20172017,不匹配20172018。

>>> mat = re.search(r'(?P<Year>\d{4})(?P=Year)','20172017') #匹配,输出
>>> mat.group()
'20172017'
>>> mat.group(1)
'2017'
>>> re.search(r'(?P<Year>\d{4})(?P=Year)','20172018') #不匹配,返回None
>>>

字符串前r的含义

字符串前r表示不转义,使用真实字符。举例如下:

>>> str = "Hello\tWorld"
>>> print str
Hello  World
>>> str = r"Hello\tWorld"
>>> print str
Hello\tWorld

re模块常用函数

1、match(pattern,string,flags=0)

根据pattern从string的头部开始匹配字符串,只返回第1次匹配成功的对象,否则,返回None。flags表示规则选项。

>>> import re
>>> Str='Python:Java:C'
>>> re.match(r'Python',Str) #匹配成功
<_sre.SRE_Match object at 0x0000000005C5FCC8>
>>> Str='Java:Python:C'
>>> re.match(r'Python',Str) #匹配失败
>>>

2、search(pattern,string,flags=0)

根据pattern在string中匹配字符串,只返回第1次匹配成功的对象,否则,返回None。

>>> import re
>>> Str='Python:Java:C'
>>> re.search(r'Python',Str) #匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>
>>> Str='Java:Python:C'
>>> re.search(r'Python',Str) #同样匹配成功
<_sre.SRE_Match object at 0x0000000005C5FCC8>

3、split(pattern,string,maxsplit=0)

根据pattern分隔string,maxsplit表示最大分隔数。

>>> import re
>>> Str='Python:Java:C'
>>> re.split(r':',Str) #指定分隔符:
['Python', 'Java', 'C']
>>> Str='Python:Java:C'
>>> re.split(r':',Str,1) #指定最大分割次数
['Python', 'Java:C']
>>> Str = "Python:Java:Shell|C++|Ruby"
>>> re.split(r'[:|]',Str) #指定多种分隔符
['Python', 'Java', 'Shell', 'C++', 'Ruby']

4、compile(pattern,flags=0)

编译正则表达式pattern,返回一个pattern对象。

>>> import re
>>> regex = r'Python'
>>> Str='Python:Java:C'
>>> p = re.compile(regex)
>>> p.match(Str)
<_sre.SRE_Match object at 0x00000000060D7D98>

说明:pattern对象方法除了match(),还包括search()、findall()、finditer()。

5、sub(pattern,repl,string,count=0)

根据指定的正则表达式,替换字符串中的子串。pattern是一个正则表达式,repl是用于替换的字符串,string是源字符串,如果count为0,则返回string中匹配的所有结果。如果count>0,则返回前count个匹配结果。

>>> import re
>>> Str='Python:Java:C'
>>> re.sub(r'P.*n','Ruby',Str)
'Ruby:Java:C'
>>> print Str #不改变原字符串
Python:Java:C

6、subn(pattern,repl,string,count=0)

作用和sub()相同,返回一个二元元组。第一个元素是替换结果,第2个元素是替换的次数。

>>> import re
>>> Str='Python:Java:C'
>>> re.subn(r'P.*:','Ruby:',Str) #返回替换次数
('Ruby:C', 1)
>>> re.subn(r'P.*?:','Ruby:',Str) #注意匹配中多了个?号,替换内容不同了
('Ruby:Java:C', 1)
>>>

说明:匹配条件中'P.*?:'有无问号?号是有区别的。不加?号是贪婪匹配。

7、findall(pattern,string,flags=0)

根据pattern在string中匹配字符串。如果匹配成功,返回包含匹配结果的列表,否则,返回空列表。但pattern中有分组时,返回包含多个元组的列表,每个元组对应一个分组。

>>> import re
>>> regex = r'\w+' #\w表示匹配包括下划线的任何单词字符
>>> Str='Python:Java:C'
>>> p = re.compile(regex)
>>> p.findall(Str)
['Python', 'Java', 'C']

描述完re模块的主要函数后,这里再强调 函数中的flags参数 和 re.compile() 函数。

1、re.flags参数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5b6389b2e8fe863f47a46e799e783aac.html