元字符:. ^ $ * + ? {} [] | () \
11个符号的使用
①通配符.
除了换行符,其他都可以匹配到
import re
str1 = "abcedafeafasdfaeaxdefae2134wsfdasedf32af"
# 匹配 "a**e"格式的字长为4的字符串
result = re.findall("a..e",str1)
print(result)
②以什么开头^
str1 = "abcedafeafasdfaeaxdefae2134wsfdasedf32af"
# 匹配以a开头格式为a**e的字符串
result = re.findall("^a..e",str1)
③以什么结尾$
# 匹配以a**e为结尾的字符串
result = re.findall("a..e$", str1)
④转义符\
- 反斜杠
\
后面跟上元字符,去取其特殊功能 - 反斜杠
\
后面更上普通字符,实现特定功能:
\d
匹配任何十进制数,相当于[0-9]
\D
匹配任何 非 数字字符,相当于[^0-9]
\s
匹配任何空白字符, 相当于[\t\n\r\f\v]
\S
匹配任何 非 空白字符, 相当于[^ \t\n\r\f\v]
\w
匹配任何字母数字字符,相当于[a-zA-Z0-9]
\W
匹配任何 非 字母数字字符,相当于[^ a-zA-Z0-9]
\b
匹配一个特殊字符边界,比如空格、&、#等
demo1:使用r
来表示raw字符串,不让python解释器转义,直接将正则表达式交给re模块
result1 = re.findall(r"c\\e", "abc\efrwt")
print(result1)
demo2:使用多个\
来解决python解释器转义
# 两个反斜杠,会被解释器转义成一个,四个反斜杠就转义成2个交给re模块
result1 = re.findall("c\\\\e", "abc\efrwt")
print(result1)
⑤匹配重复 - 四种*
+
?
{}
-
*
重复匹配前一个字符 0到无穷次 --- 贪婪匹配
str1 = "ddddadbaddddd"
result = re.findall("^d*", str1)
-
+
重复匹配前一个字符 1到无穷次 --- 贪婪匹配
demo:
str1 = "bihaha"
result1 = re.findall("bil*", str1)
result2 = re.findall("bil+", str1)
print(result1)
print(result2)
# 打印结果
# ['bi']
# []
-
?
匹配前一个字符 0次或者1次 --- 贪婪匹配
str1 = "billhaha"
result1 = re.findall('bi?', str1)
-
{}
自定义重复次数 --- 贪婪匹配
{0,}
代表0到无穷次
{0,1}
代表0到1次
{6}
代表重复6次
所以{}
可以代替前三种重复符号
str1 = "billhaha"
result1 = re.findall('bil{4}', str1)
注意:
在上面四种重复匹配符后面加?
,可以使其由 贪婪匹配 变为 惰性匹配
str1 = "billhaha"
result1 = re.findall('bil+?', str1)
⑥字符集[]
#匹配由a*b组成的字符串
result1 = re.findall('a[zxc]b', 'azbacv')
在字符集[]
符号中,只有-
^
\
三种符号有特殊意义,其他元字符按照普通字符来匹配:
-
[]
中使用-
,用来表示范围
[a-z]
[A-Z]
[0-9]
按照ASCII码来寻找范围
result1 = re.findall('a[a-z]b', 'azb')
result1 = re.findall('a[a-z]*', 'azbasdfasdfa3')
# 结果是['azbasdfasdfa']
-
[]
中使用^
,表示非
result1 = re.findall('a[^a-z]', 'azbasdfasdfa3')
# 输出结果[a3]
-
[]
使用\
表示转义符
⑦管道符|
代表 或者 的意思
result1 = re.findall(r"123a|b", "adf123abc")
# 结果是 ['123a', 'b']
⑧小括号()
分组
result1 = re.findall(r"(123)+", "adf123333abc")
# 结果['123']