实例:在测试过程中需要分析log文件,筛选有用信息,
已知字符串test_str中包含整数、小数、IP地址格式的数字及英文单词、特殊字符等,要求用正则表达式取出所有整数和小数。用python语言实现代码如下:
#!/usr/bin/python
import re
test_str = '''type logfile
[ 8] local 81.33 port 12345 connected with 82.33.44.250 port 55611
'''
ret1 = re.findall(r'([\d+\.]+)', test_str) #会匹配到IP地址
ret2 = re.findall(r'[^\.\d](\d+\.?\d+)[^\.\d]', test_str)
ret3 = re.findall(r'[^\.\d](\d+\.\d+|\d+)[^\.\d]', test_str)
print(ret1)
print(ret2)
print(ret3)
运行结果及分析
只有ret3能精确匹配到所有整数和小数。
ret1匹配结果包括IP地址'82.33.44.250',因为[\d+.]+方括号外的加号表示匹配一次或多次方括号内的字符,小数点可能匹配多次,不符合要求,所以ret2用.?表示匹配小数点0次或1次;
ret2匹配结果缺少整数8,(\d+.?\d+)圆括号前后都有[^.\d]表示获取结果前后都不能有小数点或数字,但圆括号内\d+出现了两次就不能匹配个位数,匹配不全;
代码里用到的正则表达式符号释义如下:
(pattern) 匹配pattern并获取这一匹配。要匹配圆括号字符,请使用\(\)
. 任何单个字符
\ 转义
\. 字符点
\d 匹配一个数字字符,0至9之间的数字,等价于[0-9]
| 或
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。等价于匹配长度{0,1}
[^a-z] 匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
[^xyz] 匹配非xyz的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。