python中正则表达式
正则表达式是一种通用的字符串匹配技术,是不会因为编程语言不一样而发生变化的
如果想查找对应规则的字符串,就可以用正则表达式
python中要使用正则表达式需使用re模块,它是正则表达式在python中的封装
1.匹配的方式:match、search、findall
1.1 match 表示: 从开始的位置进行匹配,即从第一个字符开始匹配,第一个没有匹配到,则整个就不会匹配到
# 匹配特定的字符串 "abc" import re re_pattern = r'abc'#写匹配规则式时,要加上转意字符r res = re.match(re_pattern, "abwofowpqfowfjowefjiwoefabcowof") # 从 "wofowpqfowfjowefjiwoefabcowof" 这个字符串当中匹配是否 有 re_pattern # match 表示: 从开始的位置进行匹配,即从第一个字符开始匹配,第一个没有匹配到,则整个就不会匹配到 print(res)
1.2search 全文匹配,如果表达式有多处可以匹配到,只会返回第一个匹配到的结果
# search, 全文匹配,如果表达式有多处可以匹配到,只会返回第一个匹配到的结果 res = re.search(re_pattern, "abcwofowpqfowfjowefjiwoefabcowof") print(res)
1.3findall 全部匹配,如果表达式有多处可以匹配到,结果也会返回多个
# findall, 全部匹配,如果表达式有多处可以匹配到,结果也会返回多个 res = re.findall(re_pattern, "abcwofowpqfowfjowefjiwoefabcowof") print(res)
2.语法
2.1 [abc] 匹配中括号中的任意一个字符
# [abc], 匹配中括号中的任意一个字符 re_pattern = r'[abc]', res = re.findall(re_pattern, "abcwofowpqfowfjowefjiwoefabcowof") print(res)
2.2 .匹配任意一个字符串 除了 \n
# . 匹配任意一个字符 re_pattern = r'.', res = re.findall(re_pattern, "abcwofowpqfowfjowefjiwoefabcowof") print(res)
2.3 \d 匹配数字,相当于[0-9]
# \d 匹配数字 data,相当于[0-9] re_pattern = r'\d' res = re.findall(re_pattern, "a123bcwofowpqfowfjowefjiwoefabcowof") print(res)
2.4 \D 匹配非数字
# \D 匹配非数字 data re_pattern = r'\D' res = re.findall(re_pattern, "a@123bcwofowpqfowfjowefjiwoefabcowof") print(res)
2.5 \w 匹配字母、数字、下划线 相当于[A-Za-z0-9_]
# \w 匹配字母,数字,下划线 re_pattern = r'\w' res = re.findall(re_pattern, "a@_123bcwofowpqfowfjowefjiwoefabcowof") print(res)
2.6 \W 反向的, 非匹配字母,数字,下划线
2.7{}匹配花括号当中次数,一般要和其他的规则配合使用
# 匹配花括号当中的数字次, 匹配几次, re_pattern = r'\d{2}' res = re.findall(re_pattern, "aa@_123b&cwofowpqfowfjowefjiwoefabcowof") print(res)
2.8 {2, } 匹配至少 2 次
# {2, } 匹配至少 2 次 # TODO: 正则表达式当中,千万不要手残,空格不能随便打 # 贪婪模式, python 当中 re_pattern = r'\w{2,}' res = re.findall(re_pattern, "aa@_123b&cwofowpqfowfjowefjiwoefabcowof") print(res)
2.9 {,2} 匹配最多 2 次
# {,2} 匹配最多 2 次 re_pattern = r'\w{,2}' res = re.findall(re_pattern, "aa@_123b&cwofowpqfowfjowefjiwoefabcowof") print(res)
2.10 {2,4} 匹配 2 -4 次,最少匹配2,最多匹配4次
# {2,4} 匹配 2 -4 次,最少匹配2,最多匹配4次 re_pattern = r'\w{2,4}' res = re.findall(re_pattern, "aa@_123b&cwofowpqfowfjowefjiwoefabcowof") print(res)
例子:匹配手机号码
# 如何去匹配一个手机号码 # re_pattern = r'1[35789]\d{9}' # res = re.findall(re_pattern, "aa@_123b&cwo17520208510fowpqfowfjowefjiwoefabcowof") # print(res)
2.11 *匹配0次或者任意次,通配符
# # * 匹配 0 次或者任意次, 通配符, # re_pattern = r'\d*' # res = re.findall(re_pattern, "aa@_123b&cwo17520208510fowpqfowfjowefjiwoefabcowof") # print(res)
2.12 + 匹配1次或者任意次数,通配符
# + 匹配 1 次或者任意次, 通配符, # re_pattern = r'\d+' # res = re.findall(re_pattern, "aa@_123b&cwo17520208510fowpqfowfjowefjiwoefabcowof") # print(res)
2.13 ? 匹配 0 次或者 1 次,非贪婪模式
# ? 匹配 0 次或者 1 次 re_pattern = r'\d?' res = re.findall(re_pattern, "aa@_123b&cwo17520208510fowpqfowfjowefjiwoefabcowof") print(res)
2.14 ^开头
# ^ 开头 re_pattern = r'^\d' res = re.findall(re_pattern, "1aa@_123b&cwo17520208510fowpqfowfjowefjiwoefabcowof") print(res)
2.15 $结尾
# # $结尾 # re_pattern = r'\d*$' # res = re.findall(re_pattern, "jiwoefabcowof3434") # print(res)
2.16组,findall中是用括号表示
search中用.group()表示
# # 组,如果你要匹配的内容,显示出来不包含首位的字符,可以加上括号 re_pattern = r'#(.*?)#' res = re.findall(re_pattern, mystr) print(res)
3.替换 re.sub()
# # 替换 re.sub() 替换操作(正则表达式,替换成的字符串,被替换的字符串) # mystr = re.sub(re_pattern, 'me123', mystr, 1)