正则表达式基础
1 正则表达式简介
正则表达式是一种用来匹配字符串的强有力的武器。设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,就认为它“匹配”,否则就不匹配。
2 元字符
(1)^
和$
行定位符用来描述字符串的边界。^
表示行的开始,$
表示行的结束。
例如:
- 若要匹配以
am
开头的字符串,则是^am
- 若要匹配以
am
结尾的字符串,则是am$
注意:
^
放在方括号里,表示排除字符
例如:[^a-zA-Z]
用于匹配一个不是字母的字符
(2).
匹配除换行符\n
以外的任意字符
(3) \w
匹配字母、数字、下划线或汉字
(4)\W
匹配除字母、数字、下划线或汉字以外的字符
(5)\s
匹配单个空白符(包括\n
和\t
)
(6) \S
匹配除单个空白符(包括\n
和\t
)以外的字符
(7) \d
匹配数字
(8) \D
匹配非数字的字符
(9) \b
匹配单词的开始或结束,单词的分界符通常是空格,标点符号或者换行。但是\b
并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。\b
匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w
。
有关
\b
可详见:https://www.cnblogs.com/litmmp/p/4925374.html
3 限定符
(1)?
匹配前面的字符零次或一次
(2)*
匹配前面的字符零次或多次
(3) +
匹配前面的字符一次或多次
(4) {n}
匹配前面的字符n次
(5) {n,}
匹配前面的字符至少n次
(6){n,m}
匹配前面的字符最少n次,最多m次
4 字符类
如果要匹配未预定义的元字符集合,只需要在方括号里列出它们就可以了
例如:
[aeiou]
:匹配任意一个英文元音字母
[0-9]
:匹配一位数字,与\d
代表含义完全一致
[\u4e00-\u9fa5]
:匹配字符串中任意一个汉字
python提供了re模块,用于实现正则表达式的操作。在实现时,可以用re模块提供的方法进行字符串处理,也可以先使用re模块compile()方法将模式字符串转换为正则表达式对象,然后再用该正则表达式对象的相关方法来操作字符串。
5 匹配字符串
5.1 使用match()方法进行匹配
match()
方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回match()对象,否则返回 None。
语法格式如下:
re.match(pattern, string, [flags])
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,可选参数,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
可选标志
例如:
import re
pattern = r'tb_\w+'
string = 'TB_SHOP tb_shop'
match = re.match(pattern, string, re.I)
# 匹配出TB_SHOP这七个字符
print(match) # <re.Match object; span=(0, 7), match='TB_SHOP'>
# match对象中包含了匹配值的位置和匹配数据
print('匹配值的起始位置:', match.start()) # 匹配值的起始位置: 0
print('匹配值的结束位置:', match.end()) # 匹配值的结束位置: 7
print('匹配位置的元组:', match.span()) # 匹配位置的元组: (0, 7)
print('要匹配的字符串:', match.string) # 要匹配的字符串: TB_SHOP tb_shop # 注意该方法没有括号
# group()或者group(0)将返回整个匹配的子串,group(n)将返回第n个对应的字符串,n从1开始
print('获取匹配到的内容:', match.group())
string = '商店名称TB_SHOP tb_shop'
match = re.match(pattern, string, re.I)
# 当第一个字母不符合条件时则不再进行匹配,直接返回None
print(match) # None
group()用法详见
https://www.cnblogs.com/erichuo/p/7909180.html
5.2 使用search()方法进行匹配
search() 方法用于在整个字符串搜索第一个匹配的值,如果匹配成功,则返回 match() 对象,否则返回None。
语法格式如下:
re.search(pattern, string, [flags])
例如:
import re
pattern=r'tb_\w+'
string='TB_SHOP tb_shop'
match=re.search(pattern,string,re.I)
# 匹配出TB_SHOP这七个字符
print(match)
string='商店名称TB_SHOP tb_shop'
match=re.search(pattern,string,re.I)
print(match)
执行结果如下:
<_sre.SRE_Match object; span=(0, 7), match='TB_SHOP'>
<_sre.SRE_Match object; span=(4, 11), match='TB_SHOP'>
5.3 使用findall()方法进行匹配
findall() 方法用于在整个字符串搜索所有符合正则表达式的字符串,并以列表形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。
语法格式如下:
re.findall(pattern, string, [flags])
例如:
import re
pattern = r'tb_\w+'
string = 'TB_SHOP tb_shop'
match = re.findall(pattern, string, re.I) # 不区分大小写
# 匹配出TB_SHOP这七个字符
print(match)
string = '商店名称TB_SHOP tb_shop'
match = re.findall(pattern, string) # 区分大小写
print(match)
执行结果如下:
['TB_SHOP', 'tb_shop']
['tb_shop']
6 替换字符串
sub方法用于实现字符串的替换。
subn() 方法几乎与 sub()一样,但是会返回一个替换的次数。
语法格式如下:
re.sub(pattern, repl, string, [count], [flags])
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 可选参数,模式匹配后替换的最大次数,默认 0 表示 替换所有的匹配。
flags:可选参数,标志位,用于控制匹配方式
例如:
import re
pattern=r'1[34578]\d{9}'
string='中奖号码为787087876,联系电话为:13866666666'
result=re.sub(pattern,'138****6666',string)
print(result)
执行结果如下:
中奖号码为787087876,联系电话为:138****6666
7 分割字符串
split() 方法用于实现正则表达式分割字符串,并以列表的形式返回。其作用同字符串对象的·split() 方法类似,所不同的就是其分割字符由模式字符串指定。
语法格式如下:
re.split(pattern, string, [maxsplit], [flags])
maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
例如:
import re
str1='@你们 @我们 @他们'
pattern=r'\s*@'
list1=re.split(pattern,str1)# 用空格和@或者单独的@分割字符串
print('分割后的字符串为:')
for i in list1:
print(i)
执行结果如下:
分割后的字符串为:
你们
我们
他们