1、正则表达式的定义
定义:正则表达式是一个特殊的字符序列,可以判断一个字符串内是否与我们所设定的字符序列相匹配。
模块:python内部的re 模块拥有全部的正则表达式功能,可以直接调用来实现正则匹配。
实现的原理:正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
例:判断字符串内是否含有Python
使用re.findall("匹配规则", "要匹配的字符串"),实现匹配确认。
import re a = 'C|C++|Java|C#|Python|Javascript' r = re.findall("Python", a) print(r) #规则 if len(r) > 0 : print("字符串中包含Python") else : print("No")
2、元字符与普通字符
正则式的匹配规则可以使用元字符与普通字符来进行设定。
普通字符:如"Python"
元字符:如抽象符号\d:匹配一个数字字符,等价于[0-9]
例:查找出字符串内0-9的数字
import re a = 'C0C++8Java9C#55Python76Javascript' r = re.findall("\d", a) print(r)
3、字符集
字符集:可使用[]将需要匹配的字符同时添加进去。如下例字符集:a[cf]c,可同时匹配acc、afc
import re a = 'abc, acc, adc, aec, afc, ahc' r = re.findall("a[cf]c", a) print(r)
4、概括字符集
字符集或概括字符集都只能匹配一个单一字符。
\d是0-9数字字符
\D是非0-9的字符,等价于^\d
\w是单词字符(数字、字母)
\s是空白字符(' ','\t','\n', '\r'等)
. 匹配除换行符\n之外的其他所有字符
5、数量词
{3}:匹配3个字符。如[a-z]{3}:匹配3个字符,字符为a-z
{3,6}:匹配3-6个字符。
6、贪婪与非贪婪
贪婪:尽可能匹配更多
非贪婪:在匹配字符串后面加?。如[a-z]{3, 6}?
7、匹配0次1次或者无限多次
*:表示匹配0次或者无限多次
+:表示匹配1次或者无限多次
如'Python*':(表示最后一个字符n可以匹配0或无限次),输出结果为pytho, python, pythonn
如'Python+':(表示最后一个字符n可以匹配1或无限次),输出结果为python, pythonn
import re a = 'pytho0Python1Javascriptpythonn2' r = re.findall("Python*", a) print(r)
8、边界匹配符
边界符号:^, $。如^\d{4, 8}$
^:最前面的字符必须为\d
$:最后面的字符必须为\d
# 边界匹配 import re qq = '123456789' # 4~8 # ^表示左边界的字符匹配 # $表示有边界的字符匹配 r = re.findall("^\d{4, 8}$", qq) print(r)
如000$:表示最后面的3个字符必须是000
9、字符组的重复匹配
如(python){3}:表示匹配的字符是pythonpythonpython,即将python合并成组,然后匹配3个组
匹配的字符可以不止一个组,如(python){3}(JS)
区别:[abc]:表示a或b或c,里面是或的关系
(abc):表示abc,里面是成组,成块的。
10、匹配模式参数
re.findall():第3个参数就是描述匹配模式,如re.I表示忽略字母大小写
第3个参数可以设置多个匹配模式,使用|连接。如re.I | re.S
re.S表示 . 可以描述所有字符
import re language = 'pythonC#\nJavaPHP' # re.I 忽略字符的大小写 # re.S 表示.可以描述所有字符(包含\n) r = re.findall("c#.{1}", language, re.I | re.S) print(r)
11、字符串替换
re.sub,字符串替换,类似replace函数
import re language = 'pythonC#JavaC#PHPC#' # 替换字符串 # r = re.sub('C#', 'GO', language, 2) a = language.replace('C#', 'GO', 2) print(language) print(a)
12、动态替换
使用convert函数作为re.sub的参数,来进行动态替换字符串
import re language = 'pythonC#JavaC#PHPC#' # 定义一个convert函数,进行动态替换字符串 def convert(value): matched = value.group() return '!!' + matched + '!!' r = re.sub('C#', convert, language) print(r)
输出结果:python!!C#!!Java!!C#!!PHP!!C#!!
import re s = 'A8C3721D86' # 定义一个convert函数,进行动态替换字符串 def convert(value): matched = value.group() if int(matched) >= 6: return '9' else: return '0' r = re.sub('\d', convert, s) print(r)
输出结果:A9C0900D99
13、re.match与re.search
import re s = 'A8C3721D86' r1 = re.match('\d', s) r2 = re.search('\d', s) print(r1) print(r2) print(r2.group()) print(r2.span())
输出结果:
None
<re.Match object; span=(1, 2), match='8'>
8
(1, 2)
区别:match是尝试从字符串首字母处开始查找是否匹配,如果不匹配则返回None。search是尝试搜索整个字符串,如果有匹配的,则返回相关结果。如果首字母就匹配,那么match和search功能基本差不多。
14、group分组
import re s = 'life is short, i use python' r = re.search('life(.*)python', s) # 0返回完整匹配结果 print(r.group(0)) # 1返回分组内的匹配结果 print(r.group(1))
输出结果:
life is short, i use python
is short, i use
注意:group(1)表示第一个组块。
groups():表示所有组块。
15、常用正则表达式
为了学习,可以有意识的多使用正则表达式,建议多分析网络上已经写好的常用正则表达式。