您的位置:首页 > 编程语言 > Python开发

python与正则表达式

2017-11-25 20:45 369 查看

正则表达式

推荐一本书:《Sams Teach Yourself Regular Expressions in 10 Minutes》。

下面列举常用的regex元字符。

元字符作用
.任意字符匹配
\转义特殊字符
[ ]使用[和]来包含一个字符集合,代表和其中任意一个成员匹配的文本
\w字母、数字
\d数字
( )常常用于子表达式的构建
\E结束\L或\U的转换
\U将\U和\E之间的字符全部转换成大写字符
\L将\L和\E之间的字符全部转换成小写字符
\u将\u后面的字符或者子集变成大写字符
\l将\l后面的字符或者子集变成小写字符
[\b]回退删除 backspace
\f换页
\n换行
\r回车
\t制表符 tab
\v垂直制表符
\s空白符
\b匹配着这样的位置:位于一个能构成单词的字符(字母,数字,下划线。\w)和不能构成单词的字符(\W)之间对于cat scatter文本,\bcat\b仅仅匹配第一个单词cat
*匹配0个或者多个
+匹配至少一个
{n,m}匹配n到m个
贪婪型元字符懒惰型元字符
**?
++?
{n,}{n,}?
书中提到的正则表达式测试器,可下载:http://www.forta.com/books/0672325667/

是一个很棒的用于练习正则表达式的文本工具。

正则表达式在python中的应用

正则表达式模式匹配

正则表达式模块re是python自带的。

基本步骤:

导入re库

创建Regex对象

搜索并返回match对象

返回匹配的字符串

>>> import re
>>> regex = re.compile(r"\d{3}-\d{3}-\d{4}")
>>> match = regex.search('231-345-8972')
>>> print(match.group())
231-345-8972


正则分组

通过group返回正则分组

>>> import re
>>> regEx = re.compile(r'(\d{3})-(\d{3})-(\d{4})')
>>> mo = regEx.search('231-345-8972')
>>> mo.group(1)
'231'
>>> mo.group(2)
'345'
>>> mo.group(3)
'8972'
>>> mo.group(0)
'231-345-8972'
>>>


返回所有的分组

>>> mo.groups()
('231', '345', '8972')


正则表达式的贪心和非贪心

?
在正则表达式中可以表示可选,也能表示非贪心匹配。

#! /usr/bin/python
import re
batRegex = re.compile(r'(Ha){3,5}')
mo = batRegex.search('HaHaHaHaHa')
print(mo.group())

batRegex = re.compile(r'(Ha){3,5}?')
mo = batRegex.search('HaHaHaHaHa')
print(mo.group())


执行:

[edemon@CentOS workspace]$ ./regex.py
HaHaHaHaHa
HaHaHa


regex对象的search和findall

search方法在找到第一个匹配的内容后即停止了工作,但是findall会返回所有的字符串,以list的形式供我们处理。

#! /usr/bin/python
import re
text = '''231-345-8972
213-324-5476'''
print("origin text is:\n"+text)

regex = re.compile(r'\d{3}-\d{3}-\d{4}')
mo = regex.search(text)
print("search result is:" + str(mo.group()))

rlist = regex.findall(text)
print("findall result is:" + str(rlist))


运行效果:

[edemon@CentOS workspace]$ ./regex.py
origin text is:
231-345-8972
213-324-5476
search result is:231-345-8972
findall result is:['231-345-8972', '213-324-5476']


常用字符分类缩写

分类字符表示
\d0-9的任何数字
\D除0-9的数字以外的字符
\w字母、数字、下划线字符
\W除字母、数字、下划线以外的任何字符
\s空白字符(空格、制表符、换行符)
\S除空白字符以外的字符

匹配换行

如果使得re.DOTALL作为re.compile()第二个参数,那么
.
将匹配所有的字符,包括换行。

re.DOTALL

Make the ‘.’ special character match any character at all, including a newline; without this flag, ‘.’ will match anything except a newline.

不区分大小写的匹配

给re.compile()传入第二个参数re.IGNORECASE或re.I则不理会字母的大小写。

如下:

import re
text = 'Hello World'
mo = re.compile('hello world',re.I)
print(mo.search(text).group())

# Hello World


VERBOSE

compile的flag: re.VERBOSE可使得正则表达式中的注释、多余空白字符都被忽略。这样增强了阅读性。

更多的应用技巧,需要靠实践掌握了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: