python 正则表达式
2015-08-31 17:57
609 查看
关于正则表达式
正则表达式(RE)是一种小型的、高度专业化的编程序语言,它内嵌在python中,并通过re模块实现它可以为想要匹配的相应字符串集指定规则
该字符串集可以包含英文语句、e-mail地址、命令或任何你想要搞定的东西
可以使用RE以各种方式来修改或分割字符串
字符匹配
普通字符:大多数子母和字符一般都会和自身匹配,如正则表达式“test”会喝字符串“test”完全匹配元字符: . ^ $ * + ? { } [ ] \ | ( )
要想把元字符看做扑通普通字符对待的话,需要用到“\”
[ ]
常用来指定一个字符集:[ abc];[a-z],匹配其中任意一个字符。>>> import re >>> s = r'abc' >>> re.findall(s,"aaabcadfdffdsfscbabcccba") ['abc', 'abc'] >>> re.findall(r"a[bc]c","abcaccaacv") ['abc', 'acc']
^ 匹配行首
查找开头是否有某个规则的字符串$ 匹配行尾
>>> s = "hello hello2" >>> r = r'hello' >>> re.findall(r,s) ['hello', 'hello'] >>> r = r'^hello' >>> re.findall(r,s) ['hello'] >>> r = r'^hello2' >>> re.findall(r,s) [] >>> r = r'hello2$' >>> re.findall(r,s) ['hello2']
元字符在字符集中不起作用:[akm$],也就是说在字符集中,[]中的几个符号都同等对待
补集不在区间范围内的字符:[^5]
^ 这个符号写在行首代表^之后的字符都不能匹配,但是写在其他地方就是和普通的字符一样。
>>> s = "abacada^aea$af" >>> r = r'a[bcf^d]' >>> re.findall(r,s) ['ab', 'ac', 'ad', 'a^', 'af'] >>> r = r'a[^bcd]' >>> re.findall(r,s) ['a^', 'ae', 'a$', 'af'] >>> r = r'a[f$]' >>> re.findall(r,s) ['a$', 'af'] >>> r = r'af$' >>> re.findall(r,s) ['af']
[ ]的简写形式
>>> r = r'[0-9]' >>> r = r'[A-Z]' >>> r = r'[a-z]'
\
\反斜杠后面可以加不同的字符以表示不同特殊意义,也可以用于取消所有的元字符:[ 或 \\d 匹配任何十进制数:相当于类[0-9]
\D 匹配任何非数字字符:相当于类[^0-9]
\s 匹配任何空白字符:相当于类[\t\n\r\f\v]
\S 匹配任何非空白字符:相当于类[^\t\n\r\f\v]
\w 匹配任何子母数字字符:相当于类[a-zA-Z0-9]
\W 匹配任何非子母数字字符:相当于类[^a-zA-Z0-9]
重复 * 零次或多次
指定前一个字符可以被匹配零次或多次,而不是只有一次。匹配引擎会尝试这重复尽可能多得次数。>>> r = r'ab*' >>> re.findall(r,'a') ['a'] >>> re.findall(r,'ab') ['ab'] >>> re.findall(r,'abbbbb') ['abbbbb']
比如,写一个匹配电话号码的格式(重复固定次数用{ }):
>>> r = r'010-\d{8}' >>> s = '010-12345678' >>> re.findall(r,s) ['010-12345678']
+ 匹配至少出现一次
? 匹配一次或零次;你可以认为它用于标识某事物是可选的,?加在*或者+的后面表示最小匹配。非贪婪模式
{m,n}
其中m和n是十进制数。该限定符的意思是至少有m个重复,至多到n个重复。忽略m会认为下界是0,忽略n会认为上届是无穷大。{0,}等同于*;{1,}等同于+;{0,1}等同于?;
使用正则表达式
re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它们来进行匹配。编译正则表达式
为什么要进行编译呢?因为之前的正则表达式如果使用率较高,那么编译之后用起来速度更快。compile()>>> r = r'010-\d{8}' >>> s = '010-12345678' >>> p = re.compile(r) >>> p.findall(s) ['010-12345678']
编译的过程中,可以加一些属性,让它更灵活。比如,不区分大小写的匹配:
>>> csvt_re = re.compile(r"csvt",re.I) >>> csvt_re.findall("CsvT") ['CsvT'] >>> csvt_re.findall("CSVT") ['CSVT']
反斜杠的麻烦
字符串前加“r”反斜杠就不会被任何特殊方式处理。相关文章推荐
- 编译python3.4
- python threading多线程模块
- 使用patch修补python中serial.tools中的一个Bug
- python中的切片操作
- python queue模块
- python 中文编码问题
- python beautifulsoup多线程分析抓取网页
- 实例Python处理XML文件的方法
- 【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结
- 深入Python(4):深拷贝和浅拷贝
- 观察者模式
- Python 里不能直接赋值方式修改 sys.argv
- python相关资料分享
- python文件操作
- Python学习----函数
- 使用Python的requests库作接口测试——身份认证
- 使用Python的requests库作接口测试——响应头中的链接字段
- python学习-类理解
- Python装饰器
- 都是python写的渗透测试工具