Python 中支持正则表达式表达式的方式是导入re模块。经常使用grep命令的话,会发现Python的正则和grep基本相同。不过Python中会有多个函数来支持不同的字符串搜索方式。
一、特殊字符以及特殊序列
1.1 常用特殊字符
"." 匹配换行符以外的任何字符
"^" 匹配字符串的开始
"*" 匹配RE("*")前的0个或多个重复的字符
"+" 匹配RE("+")前的一个或多个重复的字符
"?" 匹配RE("?")前的0个或1个字符
"*?,+?,??" 前面三种的非贪心版本
"{m,n}" 匹配RE("{m,n}")前的 m 到 n个重复
"\\" 转义字符
"[]" 表示一组字符。如果"^"在"[]"开头,即[^...],则表示取该组以外的字符。如[^0-9]+表示不要数字
"|" A|B,表示匹配正则A或者正则B
"()" 匹配括号中的正则表达式。即括号中的正则当成一个整体
"(?P<name>RE)" 将正则表达式RE分组,并设置一个别名为name
"(?P=name)" 通过之前设置的别名name来匹配字符串
1.2 常用特殊序列
\number 匹配相同编号的组的内容
\A 匹配字符串的开头
\Z 匹配字符串的结尾
\b 匹配空字符串,但仅在一个单词的开头或结尾处匹配
\B 匹配空字符串,但不匹配单词的开头或结尾。
\d 匹配十进制数字。相当于[0-9]
\D 匹配任何非数字字符。相当于[^0-9]
\s 匹配任何空白字符。相当于[ \t\n\r\f\v]
\S 匹配任何非空白字符。相当于[^ \t\n\r\f\v]
\w 匹配任何字母数字字符。相当于[a-zA-Z0-9_]
\W 匹配\w的补码
\\ 匹配反斜杠
二、函数
2.1 match(pattern, string, flags=0)
功能: 将正则表达式patthern匹配到字符串string的开头。找到了则返回match对象,否则返回None。返回结果使用match.group()获得
- 示例
# 匹配成功则执行if子句
>>> strings = '0.00 0.00 0.00 1/172 19841'
>>> match = re.match('\d+', strings)
>>> if match:
... print match.group()
...
0
# 匹配失败不会执行if中的语句
>>> match = re.match('\A\D', strings)
>>> if match:
... print match.group()
...
注意,match()只能从匹配开始的部分,中间字符串是匹配不到的。看下面的例子
>>> string = '112.87.43.125 - - [31/Mar/2017:00:00:09 +0800] "GET /lua_mon/20170330_235511.c HTTP/1.1" 404 173 "-" "PycURL/7.19.7'
>>> re.match('(\d+:)+\d+', string).group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
# 如果使用search()函数就可
>>> re.search('(\d+:)+\d+', string).group()
'2017:00:00:09'
2.2 search(pattern, string, flags=0)
功能: 通过扫描string,查找能够与pattern匹配的字符串。找到了则返回match对象,否则返回None
2.3 split(pattern, string, maxsplit=0)
功能:根据pattern来分割字符串,返回包含子字符串的列表
- 示例
>>> strings = '0.00 0.00 0.00 1/172 19841'
>>> re.split(" ", strings)
['0.00', '0.00', '0.00', '1/172', '19841']
2.x compile(pattern, flags=0)
功能:编译正则表达式模式,返回一个模式对象
- 示例。取出一行Nginx日志的时间
>>> string = '112.87.43.125 - - [31/Mar/2017:00:00:09 +0800] "GET /lua_mon/20170330_235511.c HTTP/1.1" 404 173 "-" "PycURL/7.19.7'
>>> pattern = re.compile("([0-9]+:){3}\d+")
>>> pattern.search(string).group()
'2017:00:00:09'
三、其他示例
- (?P<name>) 和 (?P=name) 的使用
>>> strings = '0.00 0.00 0.00 1/172 19841'
>>> re.search('(?P<loads>[0-9]+.[0-9]+) (?P=loads) (?P=loads)', strings).group()
'0.00 0.00 0.00'
网友评论