符号 | 说明 |
---|---|
. | 匹配任意字符 |
[] | 匹配集合中的任意字符 |
[^] | 集合取反 |
\d | 匹配任意数字,与[0-9]同义 |
\D | 匹配除数字外任意字符 |
\w | 匹配任意数字字母下划线 |
\W | 匹配除数字字母下划线外的字符(特殊字符) |
\s | 匹配空白字符,包括空格和tab |
\S | 匹配任意非空字符 |
re1|re2 | 匹配正则表达式1或正则表达式2 |
* | 前一个字符出现任意次 |
+ | 前一个字符至少出现一次 |
? | 前一个字符最多出现一次 |
{M,N} | 前一个字符出现M到N次 |
^ | 匹配行首 |
$ | 匹配行尾 |
\b | 匹配单词边界 |
(RE) | 对正则表达式进行分组 |
\NUMBER | 匹配已保存的组 |
(?<NAME>RE) | 分组同时为该组命名 |
核心函数和方法
1. match函数
- 从字符串开头匹配,如果匹配成功,则返回匹配的对象,否则返回None
2. search函数
- 在字符串中匹配表达式的第一次出现,如果匹配成功,则返回匹配的对象,否则返回None
3. group方法
- 使用match或search匹配成功后,返回的匹配对象可以使用
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函数
- 和findall()函数具有相同功能,但返回的不是列表而是迭代器,对于每个匹配,该迭代器返回一个匹配对象
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)