定义
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,
(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被
编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
二元字符
. ^ $ * + ? { } [ ] | ( )
实例
+ 匹配+号前内容1次至无限次
? 匹配?号前内容0次到1次
{m} 匹配前面的内容m次
{m,n} 匹配前面的内容m到n次
*?,+?,??,{m,n}? 前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
从前面的描述可以看到'*','+'和'*'都是贪婪的,但这也许并不是我们说要的,
所以,可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的RE。示例,
1 print(re.findall(r"a(d+?)","a23b")) # 非贪婪模式 2 >>>['2'] 3 print( re.findall(r"a(d+)","a23b")) 4 >>> ['23']
:
反斜杠后边跟元字符去除特殊功能,
反斜杠后边跟普通字符实现特殊功能。
引用序号对应的字组所匹配的字符串
1 #search查找匹配字符的起始位置与终止位置 2 n=re.search(r"(alex)(eric)com2","alexericcomeric") 3 print(n.span()) 4 >>>(0, 15)
d 匹配任何十进制数;它相当于类 [0-9]。
D 匹配任何非数字字符;它相当于类 [^0-9]。
s 匹配任何空白字符;它相当于类 [
fv]。
S 匹配任何非空白字符;它相当于类 [^
fv]。
w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
: 匹配一个单词边界,也就是指单词和空格间的位置。
匹配单词边界(包括开始和结束),这里的“单词”,是指连续的字母、数字和
下划线组成的字符串。注意,的定义是w和W的交界,
这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。
单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标
示的。
1 print( re.findall(r"abc","dzx &abc sdsadasabcasdsadasdabcasdsa")) 2 >>>['abc'] 3 print( re.findall(r"abc","dzx &abc sdsadasabcasdsadasdabcasdsa")) 4 >>>['abc'] 5 print( re.findall(r"abc","dzx sabc sdsadasabcasdsadasdabcasdsa")) 6 >>>[]
注意:
re.match('com', 'comwww.runcomoob')
re.search('dcom', 'www.4comrunoob.5com')
一旦匹配成功,就是一个match object 对象,而match object 对象拥有以下方法:
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
1. group()返回re整体匹配的字符串,
2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
3.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到
所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则
表达式中定义的组。
1 import re 2 a = "123abc456" 3 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 4 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) 5 >>>[123] 6 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) 7 >>>[abc] 8 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) 9 >>>[456]
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3)
列出第三个括号匹配部分。
#re.findall 以列表形式返回所有匹配的字符串 #re.findall可以获取字符串中所有匹配的字符串。如: p = re.compile(r'd+') print(p.findall('one1two2three3four4')) >>>['1', '2', '3', '4'] #获取字符串中,包含'oo'的所有非字符单词 text = 'djks#dooljsdJ(' print(re.findall(r'w*oow*', text)) >>>['dooljsdJ']
#以数字分割字符串 p = re.compile(r'd+') print(p.split('one1two2three3four4')) >>>['one', 'two', 'three', 'four', ''] #等同于 print(re.split('d+','one1two2three3four4')) >>>['one', 'two', 'three', 'four', '']
1 a = 'abc123abv23456' 2 b = re.findall(r'23(a)?',a) 3 print(b) 4 >>>['a', ''] 5 #匹配23后面为任意一个字符 6 b = re.findall(r'23(?:a)?',a) 7 print(b) 8 >>>['23a', '23']