Python之re正则模块二
13、编译的标志
可以用re.I、re.M等参数,也可以直接在表达式中添加"?(iLmsux)"标志
*s:单行,“.”匹配包括换行符在内的所有字符
*i:忽略大小写
*L:让"\w"能匹配当地字符,貌似对中文支持不好
*m:多行
*x:忽略多余的空白字符,让表达式更易阅读
*u:Unicode
例子:
>>> re.findall(r"[a-z]+","%123Abc%45xyz&")
['bc', 'xyz']
>>> re.findall(r"[a-z]+","%123Abc%45xyz&",re.I)
['Abc', 'xyz']
>>>
>>> re.findall(r"(?i)[a-z]+","%123Abc%45xyz&",re.I)
['Abc', 'xyz']
更好的格式:
>>> pattern=r"""
... (\d+) #number
... ([a-z]+) #letter
... """
>>>
>>> re.findall(pattern,"%123Abc\n%45xyz&",re.i | re.S |re.x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'i'
#由错误可见是大写
>>> re.findall(pattern,"%123Abc\n%45xyz&",re.I | re.S |re.X)
[('', 'Abc'), ('', 'xyz')]
>>>
组操作
命名组:(?P<name>...)
>>> for m in re.finditer(r"(?P<digit>(\d+))(?P<letter>([a-z]+))","%123Abc%45xyz&",re.I):
... print m.groupdict()
...
{'digit': '', 'letter': 'Abc'}
{'digit': '', 'letter': 'xyz'}
无捕获组:(?:...),作为匹配条件,但不返回:
>>> for m in re.finditer(r"(?:(\d+))(?P<letter>([a-z]+))","%123Abc%45xyz&",re.I):
... print m.groupdict()
...
{'letter': 'Abc'}
{'letter': 'xyz'}
反向引用:\<number>或者(?P=name),引用前面的组:
>>> for m in re.finditer(r"<(\w)>\w+</(\1)>","%<a>123Abc</a>%<b>45xyz</b>&%"):
... print m.group()
...
<a>123Abc</a>
<b>45xyz</b>
>>> for m in re.finditer(r"<(?P<tag>\w)>\w+</(?P=tag)>","%<a>123Abc</a>%<b>45xyz</b>&%"):
... print m.group()
...
<a>123Abc</a>
<b>45xyz</b>
正声明(?=...):组内容必须出现在右侧,不返回
负声明(?!...):组内容不能出现在右侧,不返回
反向正声明(?<=):组内容必须出现在左侧,不返回
反向负声明(?<!):组内容不能出现左侧,不返回
>>> for m in re.finditer(r"\d+(?=[ab])","%123Abc%45xyz%780b&",re.I):
... print m.group()
...
123
780
>>> for m in re.finditer(r"(?<!\d)[a-z]{3,}","%123Abc%45xyz%bysc&",re.I):
... print m.group()
...
bysc
修改
split:用pattern做分割符切割字符串。如果用“(pattern)”,那么分隔符也会返回。
>>> re.split(r"\W","abc,123,x")
['abc', '', 'x']
>>> re.split(r"(\W)","abc,123,x")
['abc', ',', '', ',', 'x']
#将pattern使用括号引用起来,也返回分隔符
split(pattern, string, maxsplit=0)
Split the source string by the occurrences of the pattern,
returning a list containing the resulting substrings.
sub:替换子串,可指定替换次数:
>>> re.split(r"(\W)","abc,123,x")
['abc', ',', '', ',', 'x']
>>> re.sub(r"[a-z]+","*","abc,123,x")
'*,123,*'
>>>
>>> re.sub(r"[a-z]+","*","abc,123,x",1)
'*,123,x'
sub(pattern, repl, string, count=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.
subn()和sub()差不多,不过返回"(新字符串,替换次数)":
>>> re.subn(r"\W","*","abc,123,x")
('abc*123*x', 2)
还可以将替换字符串改成函数,以便替换成不同的结果:
>>> def repl(m):
... print m.group()
... return "*" *len(m.group())
...
>>> re.subn(r"[a-z]+",repl,"abc,123,x")
abc
x
('***,123,*', 2)
>>>
Python之re正则模块二的更多相关文章
- Python自动化开发 - 常用模块(二)
本节内容 1.shutil模块 2.shelve模块 3.xml处理模块 4.configparser模块 5.hashlib模块 6.subprocess模块 7.re模块 一.shutil模块 高 ...
- python中常用的模块二
一.序列化 指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化, 不同的序列化结果不同,但目的是一样的,都是为了存储和传输. 一,pickle.可 ...
- python之路----常用模块二
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- Python基础-re正则模块
一.简介: 正则表达式:是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 二.字 ...
- python的logging日志模块(二)
晚上比较懒,直接搬砖了. 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('Thi ...
- Python之re正则模块
正则表达式可以帮助我们更好的描述复制的文本格式,可以更好地利用它们对文本数据进行检索.替换.提取和修改操作. http://www.cnblogs.com/huxi/archive/2010/07/0 ...
- Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符
四.匹配分组 [元字符] 分组符号 a|b 匹配字符a 或 字符b (如果两个当中有重合部分,把更长的那个放前面) (ab) 匹配括号内的表达式 ,将()作为一个分组 num 引用分组 ...
- 进击的Python【第五章】:Python的高级应用(二)常用模块
Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...
- 小白的Python之路 day5 re正则模块
re正则模块 一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串 ...
随机推荐
- windows2008(64位)下iis7.5中的url伪静态化重写(urlrewrite)
以前在windows2003里,使用的是iis6.0,那时常使用的URL重写组件是iisrewrite,当服务器升级到windows2008R2时,IIS成了64位的7.5,结果iisreite组件是 ...
- JavaFX引入资源问题
描述 - 使用javafx 引入资源的时候 抛出异常 在swing引入资源 采取相对路径即可,而javafx不是 ImageView imageNode = (ImageView) root.look ...
- Linux入门(14)——Ubuntu常用快捷键
打开终端:ctrl + alt + T 左右分屏:ctrl + win + 箭头左或者箭头右 显示桌面:Ctrl + win + D 切换工作区:ctrl + alt + 箭头左或者箭头右 新建文件夹 ...
- 正确理解Mysql的列索引和多列索引
MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. CREATE TABLE test ( id INT NOT NULL, last_ ...
- LINUX 笔记-文件名的匹配
特殊的匹配符号: * 匹配文件名中的任何字符串,包括空字符串 ? 匹配文件名中的任何单个字符串 [...] 匹配[]中包含的任何字符 [!...] 匹配[]中非感吧号!之后的字符
- JavaScript中的比较规则之“==”运算符
"=="运算符(两个操作数的类型不相同时) 如果一个值是null,另一个值是undefined,则它们相等 如果一个值是数字,另一个值是字符串,先将字符串转换为数学,然后使用转换后 ...
- tomcat启动报错Several ports (8080, 8009) required by Tomcat v6.0
tomcat启动报错 如下图: 问题:8080.8009端口已经被占用. 解决办法: 1.在命令提示符下,输入netstat -aon | findstr 8080 2.继续输入taskkill -F ...
- MYSQL 子查询返回多列显示
因工作需要,目前研究出一种mysql 技能,与大家分享一下. 需求:关联查询另一个大表数据的某些(一个以上)字段 方案:因关联查询的表数据太大.多表查询影响效率,单个子查询又有些多余.所以采用多列拼接 ...
- 学习Identity Server 4的预备知识
我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...
- 从架构演进的角度聊聊Spring Cloud都做了些什么?
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...