正则表达式:由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中 匹配出符合规则的子字符串
正则表达式在所有语言中,都是通用的。
一:正则表达式表
模式 | 描述 |
---|---|
w |
匹配:数字、字母、下划线 |
W |
匹配:非数字、字母、下划线 |
s |
匹配:任意非空白字符,等价于 [
f ] |
S |
匹配:任意非空字符 |
d |
匹配:任意数字,等价于 [0-9] |
D |
匹配:任意非数字字符 |
A |
匹配:字符串开始 |
z |
匹配:字符串结束 |
|
匹配:字符串结束(如果存在换行,则只匹配到换行之前的结束字符串) |
G |
匹配:最后匹配完成的位置 |
|
匹配:一个换行符 |
|
匹配:一个制表符 |
^ |
匹配:字符串的开头 |
$ |
匹配:字符串的末尾 |
. |
匹配:任意字符(除了换行符
)末尾加上 re.DOTALL 则可以包括任意字符(包括换行符) |
[...] |
匹配:表示一组字符(除了换行符 ) |
[^...] |
匹配:不在[]中的字符 |
* |
匹配:0个或多个表达式,贪婪 |
+ |
匹配:1个或多个表达式,贪婪 |
? |
匹配:0个或1个前面的正则表达式定义的片段,非贪婪 |
{n} |
匹配:精确匹配n个前面的表达式 |
{n,m} |
匹配:n到m次 由前面的正则表达式定义的片段,非贪婪 |
a丨b |
匹配:a或者b |
() |
匹配:括号内的表达式,表示一个分组 |
二:正则表达式 详解
w
匹配:数字 字母 下划线
print(re.findall('w', "hello 123_(0"))
# w:匹配 数字、字母、下划线(不包括空格)
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '0']
print(re.findall('www', "hello 123_(0"))
# www:连续匹配3个连续的数字、字母、下划线(不包括空格),遇到空格就直接往后继续匹配
# ['hel', '123']
W
匹配:非数字 字母 下划线
print(re.findall('W', "hello 123_(0"))
# W:匹配除了数字 字母 下划线之外的字符(包括空格)
# [' ', '(']
s
匹配:任意空白字符,等价于[
f]
print(re.findall('s', "h ello 123_(0"))
# s:匹配空白字符串
# [' ', ' ']
S
匹配:任意非空字符
print(re.findall('S', "h ello 123_(0"))
# S:匹配非空字符(除了空格和换行符之外的字符)
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '(', '0']
d
匹配任意数字 [0-9]
print(re.findall('d', "h ello 123_(0"))
# 匹配数字1-9
# ['1', '2', '3', '0']
D
匹配任意非数字
print(re.findall('D', "h ello 123_(0"))
# 匹配除了1-9之外的所有字符(包括空格、换行符 )
# ['h', ' ', 'e', 'l', 'l', 'o', ' ', '_', '(']
匹配一个换行符
res = '''a sd asd
1
2
3
'''
print(re.findall('
', res))
#
:匹配带有换行符的字符串
# ['
', '
', '
', '
', '
', '
']
匹配一个制表符
msg="""h e ll
o 123_ (0
1
"""
print(re.findall(' ',msg))
# :匹配带有制表符的字符串
# [' ', ' ']
^
匹配以...开头的字符
print(re.findall("^xxq", "xxq asdf 213123 xxqafsadfasdn"))
# ^xxq:匹配以xxq开头的字符串
# ['xxq']
$
匹配以...结尾的字符
print(re.findall("xxq$","xxq asdf 213123 xxqafsadfxxq"))
# xxq$:匹配以xxq为结尾的字符串
# ['xxq']
.
匹配任意一个字符(除了换行符
)
print(re.findall("a.b", "a1b a2b aab aaaaaaab a+b a-b a b a c"))
# a.b:匹配a和b中间有任意字符的字符串(除了换行符)
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
[]
匹配一个字符,并且可以指定该字符的范围
中间如果要匹配-
,一定要放到最左边或者最右边,不然会被认定是一个范围符号
print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
# ['a+b', 'a-b']
print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
# ['a.b', 'a*b', 'a/b', 'a+b', 'a-b']
print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
# ['aab', 'aab']
print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
# ['aAb', 'aCb', 'aab', 'aab']
print(re.findall("adb", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
# ['a2b']
print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
# ['a2b']
[^...]
代表取反
print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))
# a[^0-9]b:匹配所有a和b中间不是数字的字符串
# ['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'aab', 'a+b', 'a-b']
*
左边的字符出现0次或者无穷次
print(re.findall("ab*", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab*:匹配任意a后面b出现任意次的字符串
# ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
+
左边的字符出现1次或者无穷次
print(re.findall("ab+", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab*:匹配任意a后面b出现一次或者任意多次的字符串
# ['ab', 'abb', 'abbbbbbbbbbbb']
{n,m}
左边的字符出现n-m次
print(re.findall("ab{0,}", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab{0,}:匹配到a之后b出现任意次数的字符串
# ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab*:匹配a后边任意个b的字符串
# ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab{1,}:匹配a后边至少1个b的字符串
# ['ab', 'abb', 'abbbbbbbbbbbb']
print(re.findall("ab+", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab+:匹配a后边至少1个b的字符串
# ['ab', 'abb', 'abbbbbbbbbbbb']
print(re.findall("ab?", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
# ab?:匹配a后边的b出现0次或者1次的字符串
# ['a', 'ab', 'ab', 'ab']
()
分组
三:拓展
print(re.findall("adb","a1b a2b aab aaaaaaab a+b a-b a c"))
# adb:匹配a和b中间有一个数字的字符串
# ['a1b', 'a2b']
print(re.findall("awb","a1b a2b aab aaaaaaab a+b a-b a c"))
# awb:匹配a和b中间有一个数字字母下划线的字符串
# ['a1b', 'a2b', 'aab', 'aab']
print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
# .:匹配a和b中间有一个任意字符的字符串(不包括
)
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
print(re.findall("a.b", "a1b a2b aab aaaaaaab a b a-b a
b a c", re.DOTALL))
# .:匹配a和b中间有一个任意字符的字符串(加了re.DOTALL可以匹配换行符)
# ['a1b', 'a2b', 'aab', 'aab', 'a b', 'a-b', 'a
b']
print(re.findall("a.*b", "123 a1231-==-000b123123123123123b"))
# a.*b:匹配a和b中间有任意几个字符的字符串
# ['a1231-==-000b123123123123123b']
例子:
1.提取出下面msg
中href
后的链接地址
msg = '<a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><a href="https://www.baidu.com">"点我啊"</a>'
print(re.findall('href="(.*?)"', msg))
# ['https://pan.baidu.com/s/1skWyTT7', 'https://www.baidu.com']