day23 - re模块

正则表达式:由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中 匹配出符合规则的子字符串

正则表达式在所有语言中,都是通用的。

一:正则表达式表

模式 描述
\w 匹配:数字、字母、下划线
\W 匹配:非数字、字母、下划线
\s 匹配:任意非空白字符,等价于 [\t \n \r \f]
\S 匹配:任意非空字符
\d 匹配:任意数字,等价于 [0-9]
\D 匹配:任意非数字字符
\A 匹配:字符串开始
\z 匹配:字符串结束
\Z 匹配:字符串结束(如果存在换行,则只匹配到换行之前的结束字符串)
\G 匹配:最后匹配完成的位置
\n 匹配:一个换行符
\t 匹配:一个制表符
^ 匹配:字符串的开头
$ 匹配:字符串的末尾
. 匹配:任意字符(除了换行符 \n)末尾加上 re.DOTALL则可以包括任意字符(包括换行符)
[...] 匹配:表示一组字符(除了换行符 \n)
[^...] 匹配:不在[]中的字符
* 匹配: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('\w\w\w', "hello 123_(0"))

# \w\w\w:连续匹配3个连续的数字、字母、下划线(不包括空格),遇到空格就直接往后继续匹配
# ['hel', '123']

\W匹配:非数字 字母 下划线

print(re.findall('\W', "hello 123_(0"))

# \W:匹配除了数字 字母 下划线之外的字符(包括空格)
# [' ', '(']

\s 匹配:任意空白字符,等价于[\t \n \r \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', ' ', '_', '(']

\n 匹配一个换行符

res = '''a sd  \tasd\n
    \t1
2

3
'''
print(re.findall('\n', res))

# \n:匹配带有换行符的字符串
# ['\n', '\n', '\n', '\n', '\n', '\n']

\t 匹配一个制表符

msg="""h e\tll\n\no 123_ (0
\t1
"""
print(re.findall('\t',msg))

# \t:匹配带有制表符的字符串
# ['\t', '\t']

^ 匹配以...开头的字符

print(re.findall("^xxq", "xxq asdf 213123 xxqafsadfasdn"))

# ^xxq:匹配以xxq开头的字符串
# ['xxq']

$ 匹配以...结尾的字符

print(re.findall("xxq$","xxq asdf 213123 xxqafsadfxxq"))

# xxq$:匹配以xxq为结尾的字符串
# ['xxq']

. 匹配任意一个字符(除了换行符\n

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("a\db", "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("a\db","a1b a2b aab aaaaaaab a+b a-b a c"))

# a\db:匹配a和b中间有一个数字的字符串
# ['a1b', 'a2b']
print(re.findall("a\wb","a1b a2b aab aaaaaaab a+b a-b a c"))
# a\wb:匹配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中间有一个任意字符的字符串(不包括\n)
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
print(re.findall("a.b", "a1b a2b aab aaaaaaab a\tb a-b a\nb a c", re.DOTALL))
# .:匹配a和b中间有一个任意字符的字符串(加了re.DOTALL可以匹配换行符)
# ['a1b', 'a2b', 'aab', 'aab', 'a\tb', 'a-b', 'a\nb']
print(re.findall("a.*b", "123 a1231-==-000b123123123123123b"))

# a.*b:匹配a和b中间有任意几个字符的字符串
# ['a1231-==-000b123123123123123b']

例子:

1.提取出下面msghref后的链接地址

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']

2.

posted @ 2020-08-03 15:23  轻描丨淡写  阅读(186)  评论(0)    收藏  举报