正则表达式

符号 说明
. 匹配任意字符
[] 匹配集合中的任意字符
[^] 集合取反
\d 匹配任意数字,与[0-9]同义
\D 匹配除数字外任意字符
\w 匹配任意数字字母下划线
\W 匹配除数字字母下划线外的字符(特殊字符)
\s 匹配空白字符,包括空格和tab
\S 匹配任意非空字符
re1|re2 匹配正则表达式1或正则表达式2
* 前一个字符出现任意次
+ 前一个字符至少出现一次
前一个字符最多出现一次
{M,N} 前一个字符出现M到N次
^ 匹配行首
$ 匹配行尾
\b 匹配单词边界
(RE) 对正则表达式进行分组
\NUMBER 匹配已保存的组
(?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)

你可能感兴趣的:(Python)