您的位置:首页 > 编程语言 > Python开发

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”反斜杠就不会被任何特殊方式处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: