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++
浙公网安备 33010602011771号