一、正则表达式介绍
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
注:本文以正则表达式在Python中的应用为例
二、普通字符和元字符
- 普通字符: 大多数字符和字母都会和自身匹配 。 如:re.findall(‘hello’,‘yuanaleSxhellowupeiqi’)
- 元字符: . ^ $ * + ? { } [ ] | ( ) \ 共11个
1.元字符之 .
通配符,与任意字符匹配
import re
ret=re.findall('a..in','helloalvin')
print(ret) #['alvin']
2.元字符之 ^ $
^表示从开头开始匹配,$表示从结尾开始匹配,二者联合使用表示从开头匹配到结尾。
^放在[]里表示取非
ret=re.findall('^a...n','alvinhelloawwwn')
print(ret)#['alvin']
ret=re.findall('a...n$','alvinhelloawwwn')
print(ret)#['awwwn']
3.元字符之 * + ? { }
均表示重复。注意: 前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
- *:0-无穷次
- +:1-无穷次
- ?:0或1次
- {}:{m, n} m到n次; {n} n次; {n, } n到无穷
ret=re.findall('abc*','abcccc')#贪婪匹配[0,+oo]
print(ret)#['abcccc']
ret=re.findall('abc+','abccc')#[1,+oo]
print(ret)#['abccc']
ret=re.findall('abc?','abccc')#[0,1]
print(ret)#['abc']
ret=re.findall('abc{1,4}','abccc')
print(ret)#['abccc'] 贪婪匹配
4.元字符之[]
表示字符集
#字符集[]里的元字符为普通字符,没有功能,除了下面几个
ret=re.findall('a[bc]d','acd')
print(ret)#['acd']
ret=re.findall('[a-z]','acd')
print(ret)#['a', 'c', 'd']
ret=re.findall('[.*+]','a.cd+')
print(ret)#['.', '+']
#在字符集里有功能的符号: - ^ \
ret=re.findall('[1-9]','45dha3')
print(ret)#['4', '5', '3']
ret=re.findall('[^ab]','45bdha3')
print(ret)#['4', '5', 'd', 'h', '3']
ret=re.findall('[\d]','45bdha3')
print(ret)#['4', '5', '3']
5.元字符之 \
转义字符:
(1) 反斜杠后边跟元字符去除特殊功能,比如.
(2)反斜杠后边跟普通字符实现特殊功能,比如\d
\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_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
注意:
(1)在编程中,第一层转义为语言本身的转义(如Python解释器,Java编译器),第二层为正则的转义
这就解释了为什么匹配 \,需要4个\,匹配数字,需要\\d,匹配字母数字, 需要\\w。
(2)Python中字符串前的r,就代表取消python解释器的转义。
6.元字符之 |
表示或
re.findall(r"ka|bc", "kaccbc") #['ka', 'bc']
7.元字符之 ()
分组
m = re.findall(r'(ad)+', 'add')
print(m)
ret=re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com')
print(ret.group())#23/com
print(ret.group('id'))#23