Python re正则表达式速查

* 文末 re 模块速查表

1. 特殊符号和字符

. 任意一个字符
.. 任意两个字符
.end     end 之前的任意一个字符
f.o 匹配 f 和 o 之间的任意字符;如 fao、f9o、f#o

|                   

择一匹配的管道符号   <=>  []

at|home             

匹配 athome

*                

匹配 0 次或多次前面出现的正则表达式

+                   

匹配 1 次或多次

?                  

匹配 0 次或 1

 

 

  

^                  

匹配字符串起始部分

$

匹配字符串终止部分

^From

任何以 From 起始的字符串

From$

任何以 From 结尾的字符串

^subject:hh$        

任何由单独的字符串 subject:hh 构成的字符串

.*giur$

giur 结尾的字符串

 

特殊字符集

特殊字符集

\d                  

匹配任何十进制数(\D 相反)<=> [0-9]

\w

任何字母数字(\W 相反)  <=>  [A-Za-z0-9]

\s

任何空格字符(\S 相反) <=> [\n\t\r\v\f]

\b

匹配任何单词边界 (\B 匹配出现在中间的字符串)

\A\Z             

匹配字符串起始和结束   <=> ^$             

\bthe\b

仅仅匹配单词 the

\Bthe

任何包含但不以 the 作为起始的字符串

\w+-\d+

任意字母数字+连字符+数字       "asd123424-1234"

字符集 & 闭包操作

字符集 & 闭包操作

[0-9]

数字 <=> \d

[a-zA-Z]

字母 <=> \w

["-a]

ASCII 中的字符                       

b[aeiu]t

匹配 batbetbitbut

[cr][23][dp][o2]

匹配 c2dor3p2r2d2c3po

[r-u][env-y][us]

r|s|t|u e|n|v|w|x|y u|s

[^aeiou]

a|e|i|o|u 字符

[^\t\n]

不匹配制表符或 \n

[dn]ot?

donodotnot

0?[0-9]

任意数字,可前置 0

[0-9]{15,16}

匹配 15 16 个数字

</?[^>]+>

匹配所有 html 标签

\d{3}-\d{3}-\d{4}

电话号码格式       "800-555-1212"

圆括号指定分组
    一对圆括号可以实现对正则表达式进行分组、匹配子组
    圆括号分组匹配使得findall返回元组,元组中,几对圆括号就有几个元素,保留空匹配

扩展表示法 **
    尽管有圆括号,但只有 (?P<name>) 表述一个分组匹配,其他的都没有创建一个分组

扩展表示法          **

(?iLmsux)

编译选项指定,可以写在findallcompile的参数中,也可以写在正则式里

(?#...)

表示注释,所有内容被忽略

(?:...)

表示一个匹配不用保存的分组

(?=...)

如果 ... 出现在要匹配字符串的后面 例如:Isaac (?=Asimov) 只匹配 'Isaac ' 后面跟 'Asimov'的字符串

(?!...)

如果 ... 不出现在要匹配字符串后面

(?<=...)

如果 ... 出现在之前的位置,则匹配

(?<!...)

如果 ... 不出现在之前的位置,则匹配

(?(id/name)yes-pattern|no-pattern)

如果 group 中的 id/name 存在匹配 yes-pattern,否则 no-pattern  例如:(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)只会匹配 <user@host.com> 或者 user@host.com 不会匹配 <user@host.com

(?<!192\.168)

如果一个字符串之前不是 192.168. 才做匹配

 

    (?P<name>)和(?P=name)可以同时使用,前者除了原有的编号外再指定一个额外的别名,后者引用别名为<name>的分组匹配到字符串

2. re 常见属性

2.1 compile()
    编译正则表达式模式,返回一个对象的模式。

2.2 match()
    match()从字符串起始对模式进行匹配,匹配对象的 group() 用于显示成功的匹配

2.3 search()
    扫描字符串查找正则表达式模式产生匹配的第一个位置,并返回MatchObject实例,否则返回None

 

2.4 findall & finditer()
    findall() 查询字符串中某个模式全部的非重复出现情况
    finditer() 在匹配对象中迭代,找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

2.5 sub() subn()
    将某字符串中所有匹配正则表达式的部分进行某种形式的替换 
    sub()返回替换后的字符串
    subn()返回替换后的字符串和替换总数组成的元组

2.6 split()
    在限定模式上使用split()分隔字符串

    此示例 DATA 为用户输入,输入内容可能是城市和州名,或城市加上ZIP编码,或者三者同时输入

3. 正则表达式示例

    3.1  通过正则表达式检测日志中的注入

        get.txt  保存正则表达式规则

\.\./
\:\$
\$\{
select.+(from|limit)
(?:(union(.*?)select))
having|rongjitest
sleep\((\s*)(\d*)(\s*)\)
benchmark\((.*)\,(.*)\)
base64_decode\(
(?:from\W+information_schema\W)
(?:(?:current_)user|database|schema|connection_id)\s*\(
(?:etc\/\W*passwd)
into(\s+)+(?:dump|out)file\s*
group\s+by.+\(
xwork.MethodAccessor
(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
xwork\.MethodAccessor
(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
java\.lang
\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
\<(iframe|script|body|img|layer|div|meta|style|base|object|input)
(onmouseover|onerror|onload)\=

        regexRules.py  把规则加载为 json

regexes = {
    "regex": {
        "get": [],
        "post":[]
    },
    "update": "20170828"
} 
fp = open("get.txt")
regexRule = fp.readlines()
for reg in regexRule:
    regexes["regex"]["get"].append({"reg":reg.rstrip('\n')})
# print regexes
fp.close()

        logAnalys.py    主函数,读取每条日志,逐条规则进行匹配

# -*- coding: UTF-8 -*-
import re
import sys
import urllib
from regexRules import regexes

reload(sys)  
sys.setdefaultencoding('utf8')  

#-----------------search bad data----------------
def checkData(uri):  
    uri = unicode(str(uri), errors='ignore')  
    uri = urllib.unquote(uri).lower()  
    regexList=regexes["regex"]["get"]
    for i in range(len(regexList)):  
        regRule=regexList[i] 
        try:  
            pattern = re.compile(r'%s'%(regRule["reg"]))
        except:  
            print regRule["reg"]  
        match = pattern.search(uri) 
        if match:  
            return 1

#-------------Reduce useless param--------------
def reduParam(url):  
    try:  
        values = url.split('?',1)[1] 
        return values
    except:  
        pass

#---------------------main----------------------
def analysLog(logPath):
    index = 0
    fp = open(logPath)
    while 1:  
        line = fp.readline()  
        if not line:  
            break  
        index += 1  
        tmpValue = reduParam(line)
        if tmpValue:
            if(checkData(tmpValue)):  
               print '%s - - %s'%(index,line)  


if __name__ == '__main__':
    analysLog('access.log')

 

 

常见正则表达式符号和特殊字符

表示法

描述

正则表达式示例

符号

re1|re2

匹配正则表达式re1re2

foo|bar

.

匹配任意除换行符"\n"外的字符

a.c

^

匹配字符串开头,在多行模式中匹配每一行的开头

^Dear

$

匹配字符串末尾,在多行模式中匹配每一行的末尾

/bin/*sh$

*

匹配前一个字符0或多次

[A-Za-z0-9]*

+

匹配前一个字符1次或多次

[a-z]+\.com

?

匹配一个字符0次或1

goo?

{}

{m}匹配前一个字符m次,{m,n}匹配前一个字符mn

[0-9]{3} ,[0-9]{5,9}

[...]

匹配字符集中的任意单个字符

[aeiou]

[^...]

不匹配字符集中的任意一个字符

[^aeiou],[^A-Za-z0-9]

[x-y]

X~y范围中的任何一个字符

[b-x]

()

匹配封闭的正则,存为子组,从表达式左边开始每遇到一个分组的左括号“(”,编号+1

([0-9]{3})?,f(oo|u)bar

特殊字符

\d

匹配任何十进制数(\D 相反)<=> [0-9]

data\d+.txt

\w

任何字母数字(\W 相反)  <=>  [A-Za-z0-9]

[A-Za-z]\w+

\s

任何空格字符(\S 相反) <=> [\n\t\r\v\f]

of\sthe

\b

匹配任何单词边界(\B相反

\bThe\b

\A(\Z)

匹配字符串起始(结束) <=> ^($)

\ADear

扩展表示法

(?iLmsux)

编译选项指定,可以写在findallcompile的参数中,也可以写在正则式里

(?x), (?im)

(?#...)

表示注释,所有内容被忽略

(?#comment)

(?:...)

表示一个匹配不用保存的分组

(?:\w+\.)

(?=...)

如果 ... 出现在要匹配字符串的后面

例如:Isaac (?=Asimov) 只匹配 'Isaac ' 后面跟 'Asimov'的字符串

(?=.com)

(?!...)

如果 ... 不出现在要匹配字符串后面

(?!.net)

(?<=...)

如果 ... 出现在之前的位置,则匹配

(?<=800-)

(?<!...)

如果 ... 不出现在之前的位置,则匹配

(?<!192\.168\.)

(?(id/name)yes-pattern|no-pattern)

如果 group 中的 id/name 存在匹配 yes-pattern,否则 no-pattern  例如:(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)只会匹配 <user@host.com> 或者 user@host.com 不会匹配 <user@host.com

(?(1)y|x)

(?P<name>...)

分组,除了原有的编号外再指定一个额外的别名

(?P<id>abc){2}

(?P=name)

引用别名为<name>的分组匹配到字符串

(?P<id>\d)abc(?P=id)

常见的正则表达式属性

函数/方法

描述

re模块函数

re.compile(pattern, flags=0)

使用可选的标记编译正则表达式的模式,返回一个正则表达式对象,可以提高正则的匹配速度,重复利用正则表达式对象。

re模块函数和正则表达式对象方法

re.match(pattern,string, flags=0)

如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的MatchObject实例,否则返回None

re.search(patternstring, flags=0)

扫描字符串查找正则表达式模式产生匹配的第一个位置,并返回MatchObject实例,否则返回None

re.findall(pattern, string, flags=0)

返回字符串中模式的所有非重叠匹配,作为字符串列表返回

re.finditer(pattern, string, flags=0)

findall()函数相同,但返回的是一个迭代器,对于每一次匹配,迭代器都返回一个匹配对象

re.split(pattern, string, maxsplit=0, flags=0)

根据正则表达式的模式分隔符,split函数将字符串分割为列表,返回成功匹配的列表,分隔最多操作maxsplit

re.sub(pattern, repl, string, count=0, flags=0)

使用re替换string中每一个匹配的子串后返回替换后的字符串

re.subn(pattern, repl, string, count=0, flags=0)

返回替换的总数

re.escape(pattern)

把pattern中,除了字母和数字以外的字符,都加上反斜杆

re.purge()

清除隐式编译的正则表达式模式

常见的匹配对象方法

group(num=0)

返回匹配对象

groups(default=None)

返回一个包含所有匹配子组的元组

groupdict(default=None)

返回一个包含所有匹配的命名子组的字典

常见的模块属性

 

re.I 、 re.IGNORECASE

不区分大小写

re.L 、 re.LOCALE

根据本地语言环境通过\w\W\b\B\s\S实现匹配

re.M 、 re.MULTILINE

多行匹配,影响^和$

re.X 、 re.VERBOSE

转义,否则#无法实现注释功能

re.S 、 re.DOTALL

使.匹配包括换行在内的所有字符

re.U

根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

 

# References

 https://docs.python.org/2/library/re.html

http://www.cnblogs.com/tina-python/p/5508402.html

 

posted @ 2017-08-21 19:57  Hxxxxx  阅读(1241)  评论(1编辑  收藏  举报