RE正则的常规用法

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

复制代码 代码如下:

import re print re.__doc__

可以查询re模块的功能信息,下面会结合几个例子说明。
2.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 只在字符串开始进行匹配
\Z 只在字符串结尾进行匹配
\b 匹配位于开始或结尾的空字符串
\B 匹配不位于开始或结尾的空字符串
\d 相当于[0-9]
\D 相当于[^0-9]
\s 匹配任意空白字符:[\t\n\r\r\v]
\S 匹配任意非空白字符:[^\t\n\r\r\v]
\w 匹配任意数字和字母:[a-zA-Z0-9]
\W 匹配任意非数字和字母:[^a-zA-Z0-9]

3.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()。

下面是几个例子: 例:最基本的用法,通过re.RegexObject对象调用

复制代码 代码如下:

#!/usr/bin/env python import re r1 = 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 python import re r1 = 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 python import re r1 = 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 python import re p = 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() 相同,但它还返回新的字符串以及替换的次数。同样 RegexObject 有:

时间: 2024-11-13 09:22:20

RE正则的常规用法的相关文章

flush 的常规用法:

flush  logs : 刷新二进制日志文件 flush  PRIVILEGES:刷新权限,修改权限或密码后,需要使用到该命令 flush tables:关闭所有表,并清空缓存中的类容 . flush tables with read lock:关闭所有打开的表,并且对所有DB中的表添加一个读锁, 直到显示执行unlock tables .该命令常用语备份数据. flush master :删除所有二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空, 创建一个新的二进制日志

vi 常规用法

vi 的用法 一.移动光标 h 向右移动 l 向左移动 j 向下移动 k 向上移动 二.以单词为单位移动 w 下一个单词词首 e 下一个单词词尾 b 当前或者前一个单词的词首 三.行内跳转 0 绝对行首 ^ 行首的第一个非空白字符 $ 绝对行尾 四.行间跳转 #G 跳转到第#行 G 最后一行 五.翻屏操作 ctrl+f 向文件尾部翻一屏 ctrl+b 向上翻一屏 ctrl+d 向下翻半屏 ctrl+u 向上翻半屏 六.删除字符 x 删除光标所在的单词 #x 删除光标处向后#个字符 七.删除命令

Vuex 常规用法

背景 很多时候我们已经熟悉了框架的运用,但是有时候就是忘了怎么用 所以这里想记下大部分的框架使用方法,方便使用的时候拷贝 一.安装 npm 方式 npm install vuex --save yarn 方式 yarn add vuex 二.vuex 用法 1.引入以及安装 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: {}, getters: {

Razor引擎常规用法

1.隐匿代码表达式 例: @model.name 会将表达式的值计算并写入到响应中,输入时采用html编码方式 2.显示表达式 例:@(model.name)会将输入@model.name字符串 3.无编码表达式 明确表渲染不应该采用html编码方式 例:@Html.Raw(model.name),会把model.name值计算原值输入,不经过Html编码处理. 4.@{代码块}可以在代码块中写C#代码,并可以在view使用 例:@{ var objname="mike"; var a

核心动画(Core Animation)简介及常规用法

Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h> 开发步骤: 初始化一个动画对象(CAAnimation)并设置一些动画相关属性. 添加动画对象到层(CALayer)中,开始执行动画. CALayer中很多属性都可以通过CAAnimation实现动画效果,包括:opacity.position.transfor

cpio命令常规用法介绍

cpio是用来建立.还原备份档的工具程序,它可以加入.解开cpio或tar备份档内的文件. 解压cpio文件 cpio -idmv < filename.cpio 解压img文件 cpio -idmv < filename.img 备份还原 备份:cpio -covB > [file|device] 将数据备份到文件或设备上 还原:cpio -icduv < [file|device} 将数据还原到系统中 常用参数 -B:让预设的blocks可以增加到5120bytes,默认是51

/i,/m,/s,/x,/A,/s,/U,/x,/j,/u 等正则修饰符用法~

i (PCRE_CASELESS) 如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配. m (PCRE_MULTILINE) 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符 (^) 仅匹配字符串的开始位置, 而”行末”元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符).这个行为和 perl 相同. 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符

iOS-Swift-String(字符串常规用法)

// //  ViewController.swift //  Swift-String // //  Created by luorende on 16/9/10. //  Copyright © 2016年 luorende. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do

Java——Collection集合的常规用法

Collection 接口是 List .Set 和 Queue 接口的父接口,该接口定义的方法即可用于操作 Set 集合,也可用于操作 List 和Queue 集合. Collection 接口里定义了如下操作集合元素的方法. /** * boolean add(Object o): 该方法用于向集合里添加一个元素.如果集合对象被添加操作改变了,则返回 true * * boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里.如果集合对象被添加操作