python正则表达式

来源:互联网 发布:unity3d硬件配置要求 编辑:程序博客网 时间:2024/06/11 13:26
  • re模块简介

    使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。

  • re的正则表达式语法

语法 意义 说明 “.” 任意字符 “^” 字符串开始 ‘^hello’匹配’helloworld’而不匹 配’aaaahellobbb’ “$” 字符串结尾 与上同理 “*” 0 个或多个字符(贪婪匹配) <*>匹配<title>chinaunix</title> “+” 1 个或多个字符(贪婪匹配) 与上同理 “?” 0 个或多个字符(贪婪匹配) 与上同理 *?,+?,?? 以上三个取第一个匹配结果(非贪婪匹配) <*>匹配<title> {m,n} 对于前一个字符重复m到n次,{m}亦可 a{6}匹配6个a、a{2,4}匹配2到4个a {m,n}? 对于前一个字符重复m到n次,并取尽可能少 ‘aaaaaa’中a{2,4}只会匹配2个 “\\” 特殊字符转义或者特殊序列 [] 表示一个字符集 [0-9]、[a-z]、[A-Z]、[^0] “|” 或 A|B,或运算 (…) 匹配括号中任意表达式 (?#…) 注释,可忽略 (?=…) Matches if … matches next, but doesn’t consume the string. ‘(?=test)’ 在hellotest中匹配hello (?!…) Matches if … doesn’t match next. ‘(?!=test)’ 若hello后面不为test,匹配hello (?<=…) Matches if preceded by … (must be fixed length). ‘(?<=hello)test’ 在hellotest中匹配test (? Matches if not preceded by … (must be fixed length). ‘(?<!hello)test’在hellotest中不匹配test
  • 正则表达式特殊序列表如下:
字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r’[0-9]’ \D 匹配任意非十进制数字字符,等价于r’[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换行符、回车、换页符、垂直线符号) \S 匹配任意非空格字符 \w 匹配任意字母数字字符 \W 匹配任意非字母数字字符 \Z 仅匹配字符串的尾部 \\ 匹配反斜线字符
  • re的主要功能函数
    常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)
    compile
    re.compile(pattern[, flags])
    作用:把正则表达式语法转化成正则表达式对象
    flags定义包括:
    re.I:忽略大小写
    re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    re.M:多行模式
    re.S:’ . ‘并且包括换行符在内的任意字符(注意:’ . ‘不包括换行符)
    re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    search
    re.search(pattern, string[, flags])
    search (string[, pos[, endpos]])
    作用:在字符串中查找匹配正则表达式模式的位置,返回 MatchObject 的实例,如果没有找到匹配的位置,则返回 None。
    match
    re.match(pattern, string[, flags])
    match(string[, pos[, endpos]])
    作用:match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。


  • 下面是几个例子:

#!/usr/bin/env pythonimport rer1 = re.compile(r'world')if r1.match('helloworld'):    print 'match succeeds'else:    print 'match fails'if r1.search('helloworld'):    print 'search succeeds'else:    print 'search fails' 

说明一下:r是raw(原始)的意思。因为在表示字符串中有一些转义符,如表示回车’\n’。如果要表示\表需要写为’\’。但如果我就是需要表示一个’\’+’n’,不用r方式要写为:’\n’。但使用r方式则为r’\n’这样清晰多了。

例:设置flag

#r2 = re.compile(r'n$', re.S)#r2 = re.compile('\n$', re.S)r2 = re.compile('World$', re.I)if r2.search('helloworld\n'):    print 'search succeeds'else:    print 'search fails' 

例:直接调用

if re.search(r'abc','helloaaabcdworldn'):    print 'search succeeds'else:    print 'search fails' 

split
re.split(pattern, string[, maxsplit=0, flags=0])
split(string[, maxsplit=0])
作用:可以将字符串匹配正则表达式的部分割开并返回一个列表
例:简单分析ip

#!/usr/bin/env pythonimport rer1 = re.compile('W+')print r1.split('192.168.1.1')print re.split('(W+)', '192.168.1.1')print re.split('(W+)', '192.168.1.1', 1) 

结果如下:
[‘192’, ‘168’, ‘1’, ‘1’]
[‘192’, ‘.’, ‘168’, ‘.’, ‘1’, ‘.’, ‘1’]
[‘192’, ‘.’, ‘168.1.1’]

findall
re.findall(pattern, string[, flags])
findall(string[, pos[, endpos]])
作用:在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回
例:查找[]包括的内容(贪婪和非贪婪查找)

#!/usr/bin/env pythonimport rer1 = re.compile('([.*])')print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo")r1 = re.compile('([.*?])')print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo")print re.findall('[0-9]{2}',"fdskfj1323jfkdj")print re.findall('([0-9][a-z])',"fdskfj1323jfkdj")print re.findall('(?=www)',"afdsfwwwfkdjfsdfsdwww")print re.findall('(?<=www)',"afdsfwwwfkdjfsdfsdwww") 

finditer
re.finditer(pattern, string[, flags])
finditer(string[, pos[, endpos]])
说明:和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并组成一个迭代器返回。同样 RegexObject 有:

sub
re.sub(pattern, repl, string[, count, flags])
sub(repl, string[, count=0])
说明:在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。如果没有找到匹配 pattern 的串,则返回未被修改的 string。Repl 既可以是字符串也可以是一个函数。
例:

#!/usr/bin/env pythonimport rep = re.compile('(one|two|three)')print p.sub('num', 'one word two words three words apple', 2) 

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

说明:该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。

0 0
原创粉丝点击