正则表达式又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是一种对字符串操作的逻辑公式,通常被用来检索、替换那些符合某个“规则”的文本。其是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是一种对字符串操作的逻辑公式,通常被用来检索、替换那些符合某个“规则”的文本。其是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式的特点:
1. 非常强的灵活性、逻辑性和功能性;
2. 可以迅速地用极简单的方式达到字符串的复杂控制;
3. 对于刚接触的人来说,比较晦涩难懂。
给定一个字符串和一个正则表达式,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式作为一门被称为“火星文字”的语言,凭借其强大的功能、简单的使用方式已经渗透到多种编程语言中。许多程序设计语言都支持直接利用正则表达式进行字符串操作,比如JavaScript等。令人遗憾的是,Python虽然被称为是“通用的高级编程语言”,但是它却并不支持直接使用正则表达式,要想在书写代码的时候使用正则需要导入“re”模块,这也是笔者要为什么用Python来阐述正则表达式的原因。
- ^ #匹配字符串的开头
- $ #匹配字符串的末尾
- . #匹配除换行符之外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
- [] #用来表示一组字符,匹配[]中的任意一个字符。如:[abc],则可匹配'a'或'b'或'c'
- [^] #匹配不在[]中的字符:如:[^abc] 匹配除了a、b、c之外的任意字符
- a|b #匹配a或b
- \w #匹配字母、数字、下划线,等价于[A-Za-z_0-9]
- \W #匹配非字母、数字、下划线,等价于[^A-Za-z_0-9]
- \s #匹配任意空白字符,等价于[\t\n\r\f]
- \S #匹配任意非空字符
- \d #匹配任意一个数字,等价于[0-9]
- \D #匹配任意非数字,等价于[^0-9]
- \A #匹配字符串开始
- \z #匹配字符串结束
- \Z #匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
- \G #匹配最后匹配完成的位置
- \b #匹配一个单词边界,也就是指单词和空格间的位置。如:"ve\b",可以匹配"love"中的"ve",但不能匹配"very"中的"ve"
- \B #匹配非单词边界。如:"ve\B",可以匹配"very"中的"ve",但不能匹配"love"中的"ve"
- \n #匹配一个换行符
- \t #匹配一个制表符
- re? #匹配0个或1个的表达式,非贪婪方式
- re* #匹配0个或多个的表达式
- re+ #匹配1个或多个的表达式
- (re) #匹配括号内的表达式
- re{n} #精确匹配n次前面表达式
- re{n,} #精确匹配n到无穷多次前面表达式
- re{n,m} #精确匹配n到m次前面表达式
- # 修饰符
- re.I #匹配时忽略大小写
- re.M #多行匹配,影响^和$
- re.X #给予你更灵活的格式以便你将正则表达式写得更易于理解
- re.L #做本地化识别(locale-aware)匹配
- re.S #使.匹配包括换行在内的所有字符
- re.U #根据Unicode字符集解析字符。这个标志影响\w, \W, \b, \B
Python常用正则方法
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,则返回None。
- import re
- print(re.match('Hello', 'Hello Python').span()) # 在起始位置匹配
- # (0, 5)
- print(re.match('Python', 'Hello Python')) # 不在起始位置匹配
- # None
re.search
扫描整个字符串并返回第一个成功的匹配。
- import re
- print(re.search('Hello', 'Hello Python').span()) # 在起始位置匹配
- # (0, 5)
- print(re.search('Python', 'Hello Python').span()) # 不在起始位置匹配
- # (6, 12)
注:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub
用于替换字符串中的匹配项。
- import re
- number = '400-888-8888 # 这是一个400电话'
- # 删除字符串中的Python注释
- num1 = re.sub(r'#.*$', '', number)
- print('电话是: ', num1)
- # 电话是: 400-888-8888
- # 删除字符串中的连字符
- num2 = re.sub(r'\D', '', num1)
- print('电话是: ', num2)
- # 电话是: 4008888888