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正则模块二的更多相关文章

  1. Python自动化开发 - 常用模块(二)

    本节内容 1.shutil模块 2.shelve模块 3.xml处理模块 4.configparser模块 5.hashlib模块 6.subprocess模块 7.re模块 一.shutil模块 高 ...

  2. python中常用的模块二

    一.序列化 指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化, 不同的序列化结果不同,但目的是一样的,都是为了存储和传输. 一,pickle.可 ...

  3. python之路----常用模块二

    collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...

  4. Python基础-re正则模块

    一.简介: 正则表达式:是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现,正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 二.字 ...

  5. python的logging日志模块(二)

    晚上比较懒,直接搬砖了. 1.简单的将日志打印到屏幕   import logging logging.debug('This is debug message') logging.info('Thi ...

  6. Python之re正则模块

    正则表达式可以帮助我们更好的描述复制的文本格式,可以更好地利用它们对文本数据进行检索.替换.提取和修改操作. http://www.cnblogs.com/huxi/archive/2010/07/0 ...

  7. Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符

    四.匹配分组   [元字符] 分组符号 a|b   匹配字符a 或 字符b  (如果两个当中有重合部分,把更长的那个放前面) (ab)   匹配括号内的表达式 ,将()作为一个分组 num  引用分组 ...

  8. 进击的Python【第五章】:Python的高级应用(二)常用模块

    Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...

  9. 小白的Python之路 day5 re正则模块

    re正则模块 一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串 ...

随机推荐

  1. 吐槽CSDN--想赚钱想疯了--强行升级皮肤--增加广告位

    一直对CSDN很有好感,和博客园同是技术分享的好平台,但是界面更清爽,用户间互动也较多.在学生时代就一直在用,平时抄个作业,竞赛搜个题,论文需要凑字数等等.当年为了下载一份源代码,或者为了下载某本买不 ...

  2. C语言第一次实验报告————PTA实验1.2.3内容

    一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度100°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...

  3. 【转】C语言产生随机数

    原文地址:http://www.cnblogs.com/xianghang123/archive/2011/08/24/2152404.html 在C语言中,rand()函数可以用来产生随机数,但是这 ...

  4. (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

  5. 【ASP.NET MVC 学习笔记】- 16 Model Binding(模型绑定)

    本文参考:http://www.cnblogs.com/willick/p/3424188.html. 1.Model Binding是Http请求和Action方法之间的桥梁,是MVC框架根据Htt ...

  6. thinkphp使用phpqrcode生成带logo二维码

    //二维码图片保存路径 $pathname = date("Ymd",time()); $pathname = "./Qrcode/" . $pathname; ...

  7. php导出csv报表

    最近系统有一个导出报表功能,之前是导出的.xsl报表,但是当导出数据达到十万条时,导出经常出现超时与导出数据不全的情况,原因是导出.xsl报表会进行HTML渲染,在这步就会卡死.所以改成了导出.csv ...

  8. IntentService学习

    IntentService是一个Service,主要就是Service和HandlerThread的结合 一.使用 不用多说和使用Service差不多,但是比Service多个一个方法实现: publ ...

  9. 关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态

    关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态 由于火狐浏览器没有安装 Adobe Flash Player 19 NPAPI这个插件 安装好了之后就可以直接运行了

  10. Windows Message Queue

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...