正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成”regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
正则表达式在很多语言里都支持,python也不例外,re模块就是正则表达式的应用.
1、正则表达式元字符
1 | \ 转义字符,将后边紧跟着的字符变成特殊字符,或将后边的特殊字符变成普通字符 |
分组的用法:
1 | (\num) 引用指定第几分组的值 |
2、预定义字符集
1 | \b 匹配一个单词边界,也就是指单词和空格间的位置,其它特殊字符也可以是单词的边界,如"#","$","&","*"等 |
3、re模块常用函数
re.A 或 re.ASCII | 使用ASCII字符集进行匹配(不常用) |
---|---|
re.I 或 re.IGNORECASE | 忽略大小写匹配 |
re.L 或 re.LOCALE | 使用当前预定字符类 \w \W \b \B \s \S 取决于当前区域设定(不常用) |
re.U 或 re.UNICODE | 使用Unicode字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性(不常用) |
re.M 或 re.MULTILINE | 多行匹配,使”^”,”$”可以在每一行中都进行匹配 |
re.S 或 re.DOTALL | 使 “.” 可以匹配换行符”\r”,”\n” |
re.X 或 re.VERBOSE | 去掉正则表达式中的所有空格符(不常用) |
1)re.compile(pattern, flags=0) :创建模式对象
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
pattern: 编译时用的表达式字符串,flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等,(常用的flags即re模块常用函数)
1 | >>> rg = re.compile(r"\d+", flags=0) |
2)re.findall(pattern, string, flags=0)
re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
1 | >>> re.findall(r"hello", "hello world hello") # 普通匹配 |
3)re.search(pattern, string, flags=0)
在字符串中寻找模式,只要找到一个符合条件的就返回.
1 | >>> re.search(r"hello", "hello world hello") |
4)re.match(pattern, string, flags=0)
在字符串开始处匹配模式.
1 | r"abc", "abcooooo").group() re.match( |
5)re.finditer(pattern, string, flags=0)
finditer与findall相似,只不过finditer返回一个迭代器,通过group()可以获取值,搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
1 | iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...') |
执行结果如下:
1 | ******************** |
6)re.sub(pattern, repl, string, count=0, flags=0)
sub按照给定的规则将string字符串中的相应的片段替换为repl,count 最多替换的次数,count=0默认为全部替换,返回替换后的字符串
1 | r"\d+", "$", "aaa1bb2ccc333") # 将连续的数字变成"$" re.sub( |
re.sub还允许使用函数对匹配项的替换进行复杂的处理。
如:re.sub(r’\s’, lambda m: ‘[‘ + m.group(0) + ‘]’, text, 0);将字符串中的空格’ ‘替换为’[ ]’。
1 | import re |
7)re.subn(pattern, repl, string, count=0, flags=0)
返回替换次数,与sub相似,count 最多替换的次数,count=0默认为全部替换,返回 一个元组,下标0为替换后的字符串,下标1成功替换的次数
1 | 1 >>> re.subn(r"\d+", "$", "aaabbccc") |
8)re.split(pattern, string, maxsplit=0, flags=0)
通过给定规则,将string进行切割,maxsplit最多切割次数,maxsplit=0默认全部切割,返回一个列表
1 | 1 >>> re.split(r"@", "a#b#c#d#e") # 没有找到"@",不切割 |
9)group:获取子模式(组)的匹配项
match和search一旦匹配成功,就是一个match object对象,需要用group()才可以打印匹配到的字符串。
b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
1 | >>>pat = re.compile(r'www\.(.*)\.(.*)') #用()表示1个组,2个组 |
10)贪婪匹配与非贪婪匹配
贪婪匹配,也就是尽可能多的匹配,后面加?号使其变成惰性匹配
1 | a = re.findall(r"a(\d+?)",'a23b') |
最后:用flags时遇到的小坑
1 | print(re.split('a','1A1a2A3',re.I))#输出结果并未能区分大小写 |