python 正则表达式

正则表达式就是记录文本规则的代码
1.match() group()
  • re.match() 根据正则表达式从头开始匹配字符串数据

import re
# 使用match方法进行匹配操作
result = re.match("it","it.cn")
# 获取匹配结果
info = result.group()
print(info)
输出:
it result
= re.match("it","www.it.cn") # 获取匹配结果 print(result)
输出: None 从头开始匹配
2.匹配单个字符
代码
功能
.
匹配任意1个字符(除了\n)
[ ]
匹配[ ]中列举的字符
\d
匹配数字,即0-9
\D
匹配非数字,即不是数字
\s
匹配空白,即 空格,tab键
\S
匹配非空白
\w
匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W
匹配特殊字符,即非字母、非数字、非汉字
示例1: .
import re
ret = re.match(".","M")
print(ret.group())
ret = re.match("t.o","too")
print(ret.group())
运行结果:
M
too
 
示例2:[]
import re
# 如果hello的首字符小写,那么正则表达式需要小写的h
ret = re.match("h","hello Python") 
print(ret.group())
# 如果hello的首字符大写,那么正则表达式需要大写的H
ret = re.match("H","Hello Python") 
print(ret.group())
# 大小写h都可以的情况
ret = re.match("[hH]","hello Python")
print(ret.group())
ret = re.match("[hH]","Hello Python")
print(ret.group())
ret = re.match("[hH]ello Python","Hello Python")
print(ret.group())
# 匹配0到9第一种写法
ret = re.match("[0123456789]Hello Python","7Hello Python")
print(ret.group())
# 匹配0到9第二种写法
ret = re.match("[0-9]Hello Python","7Hello Python")
print(ret.group())
ret = re.match("[0-35-9]Hello Python","7Hello Python")
print(ret.group())
ret = re.match("[0-3][5-9]Hello Python","39Hello Python")  选取多位数字
print(ret.group())
# 下面这个正则不能够匹配到数字4,因此ret为None
ret = re.match("[0-35-9]Hello Python","4Hello Python")
# print(ret.group())
运行结果:
h
H
h
H
Hello Python
7Hello Python
7Hello Python
7Hello Python
39Hello Python
 
示例3:\d
import re
# 使用\d进行匹配
ret = re.match("嫦娥\d号","嫦娥1号发射成功") 
print(ret.group())
嫦娥1号
 
示例4:\D
import re
match_obj = re.match("\D", "f")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")
运行结果:
f

 

示例5:\s

import re
# 空格属于空白字符
match_obj = re.match("hello\sworld", "hello world")
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")
# \t 属于空白字符
match_obj = re.match("hello\sworld", "hello\tworld")
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")
运行结果:
hello world
hello world
 
示例6:\S
import re
match_obj = re.match("hello\Sworld", "hello&world")
if match_obj:
result = match_obj.group()
print(result)
else:
print("匹配失败")
运行结果:
hello&world

 

示例7:\w
import re

# 匹配非特殊字符中的一位
match_obj = re.match("\w", "A")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")

执行结果:
A

 

示例8:\W
# 匹配特殊字符中的一位
match_obj = re.match("\W", "&")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")

执行结果:
&
 
3.匹配多个字符

 
 
代码
功能
*
匹配前一个字符出现0次或者无限次,即可有可无
+
匹配前一个字符出现1次或者无限次,即至少有1次
?
匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}
匹配前一个字符出现m次
{m,n}
匹配前一个字符出现从m到n次
4.匹配开头和结尾
代码
功能
^
匹配字符串开头
$
匹配字符串结尾

 

[^xxx] 除指定字符外的字符
import re

match_obj = re.match("[^aeiou]", "h")
if match_obj:
    # 获取匹配结果
    print(match_obj.group())
else:
    print("匹配失败")

执行结果
h
5.匹配分组
代码
功能
|
匹配左右任意一个表达式
(ab)
将括号中字符作为一个分组
\num
引用分组num匹配到的字符串
(?P<name>)
分组起别名
(?P=name)
引用别名为name分组匹配到的字符串
 

 
需求:匹配出163、126、qq等邮箱
import re
match_obj = re.match("[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com", "hello@163.com") # 其中.前面的反斜杠为转义字符,将.变为普通的符号
if match_obj:
    print(match_obj.group())
    # 获取分组数据
    print(match_obj.group(1))
else:
    print("匹配失败")
执行结果:
hello@163.com
163
示例1:\num
需求:匹配出<html>hh</html>
match_obj = re.match("<[a-zA-Z1-6]+>.*</[a-zA-Z1-6]+>", "<html>hh</div>")
if match_obj:
    print(match_obj.group())
else:
    print("匹配失败")
match_obj = re.match("<([a-zA-Z1-6]+)>.*</\\1>", "<html>hh</html>")
\\1 第一个\用来转义
if match_obj:
    print(match_obj.group())
else:
    print("匹配失败")

运行结果:
<html>hh</div>
<html>hh</html>
# r'' 正则表达式中的原生字符串,表示在字符串中的字符都是普通字符,无特殊意义
ret = re.match(r'<([a-zA-Z0-9]+)>(.*)</\1>','<div>皮鞋皮鞋</div>')

 

示例2:(?P<name>) (?P=name)
需求:匹配出<html><h1>www.itcast.cn</h1></html>
match_obj = re.match("<(?P<name1>[a-zA-Z1-6]+)><(?P<name2>[a-zA-Z1-6]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
if match_obj:
    print(match_obj.group())
else:
    print("匹配失败")
 
6.正则高级函数
 
import re
# search 在指定字符串中去匹配相应的规则,如果有多个子串满足规则时,返回第一个满足的子串
ret = re.match('\d+','销量:888 库存:99999')
print(ret)
ret = re.search('\d+','销量:888 库存:99999')
print(ret)
# findall() 在指定字符串中去匹配相应的规则,返回所有满足的子串,结果是一个列表
如果一个匹配格式中含有分组,则最终结果会以列表中嵌套元组的形式返回。
ret = re.findall('\d+','销量:888 库存:99999')
print(ret)

# sub 替换字符串,在指定的字符串中,使用指定的子串,替换满足规则的字符串
ret = re.sub('\d+','$$$','销量:888 库存:99999')
print(ret)

ret = re.sub('p','div','<p>xxpxx</p>')
print(ret)

ret = re.sub('<p>','<div>','<p>xxxx</p>')
print(ret)
ret = re.sub('</p>','</div>',ret)
print(ret)

# split 分割字符串

ret = re.split(' |,|\.','hello world,python:java.c++')
ret = re.split('[ ,\.]','hello world,python:java.c++')
print(ret)
print(ret)

s = '--'.join(ret)
print(s)
None
<_sre.SRE_Match object; span=(3, 6), match='888'>
['888', '99999']
销量:$$$ 库存:$$$
<div>xxdivxx</div>
<div>xxxx</p>
<div>xxxx</div>
['hello', 'world', 'python:java', 'c++']
['hello', 'world', 'python:java', 'c++']
hello--world--python:java--c++

 

posted @ 2020-06-08 16:04  浮云飘渺的狮子  阅读(173)  评论(0)    收藏  举报