Python的re模块实现正则表达式
一、正则表达式基本知识
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式使用***单个字符串来描述、匹配一系列匹配某个句法规则***的字符串。
正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真阅读本教程,加上应用的时候进行一定的参考,掌握正则表达式不是问题。
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
1. 普通字符
包括没有显式指定为元字符的所有可打印和不可打印字符。
字符 | 描述 |
---|---|
[ABC] | 匹配中括号[…]中的所有字符;例如:[abc] 匹配‘I can lean Abc’ 中所有的a b c字符 |
[^ABC] | 匹配除[…]中字符的所有字符 |
[A-Z] | 表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母 |
\s\S | 匹配所有。\s匹配所有空白符,包括换行;\S非空白符,包括换行 |
\w | 匹配字母、数字、下划线。等价[a-zA-Z0-9_] |
2. 非打印字符
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符 |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
3.特殊字符
具有特殊含义的字符。
特殊字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置 |
() | 标记一个子表达式的开始和结束位置。子表达式可获取供以后使用 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
. | 匹配除换行符\n外的任何单字符 |
[ | 标记一个中括号表达式的开始 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 |
|将下一个字符标记为或特殊字符、或原义字符 | |
^ | 匹配输入字符串的开始位置 |
{ | 标记限定表达式的开始 |
4.限定符
用来制定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式1次或多次 |
? | 匹配前面的子表达式零次或1次 |
{n} | 匹配确定的n次 |
{n,} | 至少匹配n次 |
{n,m} | n<=m,最少匹配n次,最多匹配m次 |
5.定位符
使得能够将正则表达式固定到行首或行尾,是的能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或结尾。
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置 |
$ | 匹配输入字符串结尾的位置 |
\b | 匹配一个单词边界 |
\B | 非单词边界匹配 |
6.选择
用园括号()将所有选择项括起来,相邻的选择间用|分割。
()–表示捕获分组,会将每个分组里的匹配的值保存起来。
6.修饰符
用于制定额外的匹配策略。
/pattern/flags
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore–不区分大小写 | 将匹配设置为不区分大小写 |
二、Python实现
1、基本步骤
Step1,导入模块:import re
Step2,创建对象:re.compile()–通过r使用使用原始字符串
通过在字符串的第一个引号之前加上 r,可以将该字符串标记为原始字符串
Step3,查找字符串:Regex对象的search()方法–返回Match对象
Step4,调用Match对象的Group()方法–返回实际匹配文本的字符串
例子:
import re #导入正则表达式模块
phoneNumberRegex = re.compile(r'\d{3}\-\d{4}-\d{4}')
mo = phoneNumberRegex.search('my Number is 134-5689-2128')
print('Number:'+mo.group())
2、Python中更多实现
- 利用括号分组
import re #导入正则表达式模块
phoneNumberRegex = re.compile(r'(\d{3})\-(\d{4})-(\d{4})') #利用()将匹配分为3个组
mo = phoneNumberRegex.search('my Number is 134-5689-2128')
print('Number:'+mo.group(0)) #返回整个匹配的文本
print('Number:'+mo.group(1))
print('Number:'+mo.group(2))
print('Number:'+mo.group(3))
返回:
Number:134-5689-2128
Number:134
Number:5689
Number:2128
- 用管道匹配多个分组
heroRegex = re.compile(r'dady|mami')
mo1 = heroRegex.findall('My dady and mami')
for each in mo1:
print('Str:'+each)
返回:
Str:dady
Str:mami
- 用问好实现可选匹配
strRegex = re.compile(r'Bat(wo)?man')#?前的(wo)可匹配1次或0次
mo = strRegex.search('Batwoman and Batman!')
print('Str:'+mo.group())
- 用星号匹配零次或多次
- 用加号匹配一次或多次
- 用花括号匹配特定次数
3、Python的不同方法
-
不区分大小写
只关心匹配字母,不关心是大写还是小写。可向re.compile()传入re.I(大写),作为第二个参数 -
findall()方法:查找所有匹配的字符串
a、search()返回一个Match对象,包含被查找字符串中的“第一次”匹配的文本。
b、findall()方法返将返回一组字符串,包含被查找字符串中的所有匹配。- 如果调用在一个没有分组的正则表达式上,将返回一个匹配字符串的列表
- 如果调用在一个由分组的正则表达式上,将返回一个字符串的元组的列表
-
sub()方法:替换字符串
第一个参数是一个字符串,用于取代发现的匹配。
第二个参数是一个字符串,原始字符串。
返回:替换完成后的字符串
agentNamesRegex = re.compile(r'Agent')
str = agentNamesRegex.sub('Timmy','Agent Alice gave the IIII')
print('Str:'+str)
返回:
Str:Timmy Alice gave the IIII
- 管理复杂的正则表达式
通过re.VERBOSE作为第二个参数,告诉re.compile()忽略正则表达式字符串中的空白符和注释。
可通过|组合使用re.IGNOREC ASE、 re.DOTALL 和 re.VERBOSE
phoneNumberRegex = re.compile(r'''
(\d{3}) #AreaCode
- #分割符
(\d{4}) #MainNumber
''',re.VERBOSE)
mo = phoneNumberRegex.search('my Number is 134-5689-2128')
print('Number:'+mo.group(0)) #返回整个匹配的文本
print('Number:'+mo.group(1))
print('Number:'+mo.group(2))
返回:
Number:134-5689
Number:134
Number:5689