Python中re模块函数使用介绍

Posted Beng Dou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中re模块函数使用介绍相关的知识,希望对你有一定的参考价值。

      Python中通过re模块实现了正则表达式的功能。re模块提供了一些根据正则表达式进行查找、替换、分隔字符串的函数。本文主要介绍re模块中常用的函数和函数常用场景。

re模块常用函数

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

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

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

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

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

>>> import re
>>> Str=Python:Java:C
>>> re.search(rPython,Str) #匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>
>>> Str=Java:Python:C
>>> re.search(rPython,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 = rPython
>>> 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(rP.*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(rP.*:,Ruby:,Str) #返回替换次数
(Ruby:C, 1)
>>> re.subn(rP.*?:,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参数

   通过查看re模块函数的原型可以发现,函数参数几乎都有flags参数,该参数用于设置匹配的附加选项。例如,是否忽略大小写、是否支持多行匹配等。常用的re模块规则选项如下所示:

I或IGNORECASE 忽略大小写
L或LOCALE 字符集本地化,用于多语言环境
M或MULTILINE 多行匹配
S或DOTALL 使.匹配包括\n在内的所有字符
X或VERBOSE 忽略正则表达式中的空白、换行,方便添加注释
U或UNICODE \w、\W、\b、\B、\d、\D、\s和\S都将使用Unicode

 通过一个忽略大小写的实例看下用法:

>>> import re
>>> Str=Python:Java:C
>>> re.match(rpython,Str) #匹配失败
>>> re.match(rpython,Str,re.I) #加re.I,匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>

2、re.compile() 函数  

  正则表达式的解析非常耗时,如果多次使用findall()的方式匹配字符串搜索效率可能比较低。如果多次使用同一规则匹配字符串,可以使用compile()进行预编译,compile函数返回1个pattern对象。该对象拥有一系列方法用于查找、替换或扩展字符串,从而提供字符串的匹配速度。patter对象的属性和方法如下

pattern #获取当前使用的正则表达式
match(string,flags=0) #同re.match()
search(string,flags=0) #同re.searc()
findall(string,flags=0) #查找所有符合pattern对象匹配条件的结果,返回1个包含匹配结果的列表。
finditer(string,flags=0) #返回一个包含匹配结果的地址

    另外,函数compile()通常与match()、search()、group()一起使用对含有分组的正则表达式进行解析。正则表达式的分组从左往右开始计数,第1个出现的圆括号标记为第1组,依次类推。此外还有0号组,0号组用于存储匹配整个正则表达式的结果。match()和search()将返回一个match对象,match对象提供了一系列的方法和属性来管理匹配的结果。match对象的方法和属性如下:

group(index=0) #某个分组的匹配结果。默认匹配整个正则表达式
groups() #所有分组的匹配结果,每个分组的结果组成1个列表返回

 举例,匹配身份证号码并获取身份证中的年、月、日信息。

>>> regex = r[1-9][0-9]{5}(\d{4})(\d{2})(\d{2})[0-9]{3}[0-9X]
>>> Str = 11010019950807532X
>>> p = re.compile(regex)
>>> m = p.match(Str)
>>> m.groups()
(1995, 08, 07)
>>> m.group(1)
1995
>>> m.group(2)
08
>>> m.group(3)
07

 典型实例

  1、多关键字任一匹配查找

>>> import re
>>> regex = rPython|Java|C
>>> Str1 = Hello Java
>>> Str2 = Python Developer
>>> p = re.compile(regex)
>>> p.findall(Str1)
[Java]
>>> p.findall(Str2)
[Python]

 

以上是关于Python中re模块函数使用介绍的主要内容,如果未能解决你的问题,请参考以下文章

re模块的高级用法

python中re模块的compile函数应该怎么用?

Python 3.x--使用re模块,实现计算器运算实例

Python基础之re模块

(数据科学学习手札32)Python中re模块的详细介绍

Python爬虫——数据解析