符号 | 说明 |
---|---|
. | 匹配任意字符 |
[] | 匹配集合中的任意字符 |
[^] | 集合取反 |
\d | 匹配任意数字,与[0-9]同义 |
\D | 匹配除数字外任意字符 |
\w | 匹配任意数字字母下划线 |
\W | 匹配除数字字母下划线外的字符(特殊字符) |
\s | 匹配空白字符,包括空格和tab |
\S | 匹配任意非空字符 |
re1|re2 | 匹配正则表达式1或正则表达式2 |
* | 前一个字符出现任意次 |
+ | 前一个字符至少出现一次 |
? | 前一个字符最多出现一次 |
{M,N} | 前一个字符出现M到N次 |
^ | 匹配行首 |
$ | 匹配行尾 |
\b | 匹配单词边界 |
(RE) | 对正则表达式进行分组 |
\NUMBER | 匹配已保存的组 |
(? |
分组同时为该组命名 |
1. match函数
2. search函数
3. group方法
group
方法获取>>> import re
>>> re.match('f..', 'food')
<re.Match object; span=(0, 3), match='foo'>
>>> re.match('f..', 'seafood') #没有输出,表示没有匹配到
>>> m = re.search('f..', 'seafood')
>>> m
<re.Match object; span=(3, 6), match='foo'>
>>> m.group()
'foo'
4. findall函数
5. finditer函数
6. compile函数
7. split方法
8. sub方法
>>> re.findall('f..', 'seafood is food')
['foo', 'foo']
# finditer返回由匹配对象构成的迭代器
>>> list(re.finditer('f..', 'seafood is food'))
>>> for m in re.finditer('f..', 'seafood is food'):
... m.group()
...
'foo'
'foo'
# 使用-或.切割字符串
>>> re.split('-|\.', 'hello-world-china.ni.hao')
['hello', 'world', 'china', 'ni', 'hao']
# 将字符串中的X替换成tom
>>> re.sub('X', 'tom', 'Hi X, Nice to meet you X')
'Hi tom, Nice to meet you tom'
# 在有大量匹配时,先将正则表达式模式字符串进行编译,将会有更好的执行效率
>>> patt = re.compile('f..')
>>> m = patt.search('seafood')
>>> m.group()
'foo'
>>> patt.findall('seafood is food')
['foo', 'foo']
#统计apache日志信息
import re
def count_pattern(fname, patt):
result = {} #用于保存结果
cpatt = re.compile(patt)
with open(fname) as fobj:
for i in fobj:
m = cpatt.search(i)
if m: #任何非空对象都为真
key = m.group()
result[key] = result.get(key, 0) + 1
return result
if __name__ == '__main__':
logfile = 'access_log'
ip = '^\d+(\.\d+){3}'
br = 'Chrome|Firefox|MSIE'
result1 = count_pattern(logfile, ip)
result2 = count_pattern(logfile, br)
print(result1)
print(result2)