Python正则表达式

122 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

导入模块

import re

常用函数

匹配开头满足条件的字符
ret=re.match("c","ccc")
print(ret.group()) 
# return: c

ret=re.match("c","acc")
print(ret.group()) 
# return: AttributeError
匹配满足条件的字符
ret=re.search("c","acb")
print(ret.group()) # return: c

"""
re.match和re.search函数的区别在于:
re.match函数仅匹配字符串的开头,如果不满足条件则返回None;
re.search函数会匹配整个字符串
"""
分组
txt="book price is $9,pen price is $8."
ret=re.search(".+(\$\d+).+(\$\d+)",txt)
print(ret.group()) # book price is $9,pen price is $8
print(ret.group(1)) # $9
print(ret.group(2)) # $8
查找所有满足条件
ret=re.findall("abc","abc,abc,abc") # 返回一个list
print(ret) 
# return: ['abc', 'abc', 'abc']
根据规则替换其他字符串
ret=re.sub("\d+?","n","123")
print(ret)
# return: nnn
根据规则切割字符串
ret=re.split('\d+',"aaa11bbb33e")
print(ret)
# return: ['aaa', 'bbb', 'e']
提前编译正则表达式
r=re.compile("\d+\.?\d+") # 提前编译
ret=re.search(r,"book price is 10.32 yuan")
print(ret.group())
正则表达式添加注释
r = re.compile(
    """
\d+ # 整数
\.? # 小数点
\d+ # 小数
"""
    , re.VERBOSE)

ret = re.search("""
\d+ # 整数
\.? # 小数点
\d+ # 小数
""", "book price is 10.32 yuan",re.VERBOSE)

基础语法

限定符

匹配1个或多个表达式
ret=re.match('q+',"qqqt")
# return: qqq
# 如果不存在匹配的字符,会产生AttributeError
匹配0个或多个表达式
ret=re.match('q*',"aqqqq")
# return: 
匹配0个或1个表达式
ret=re.match('q?',"qqq")
# return: q
匹配n个字符
ret=re.match('\d{3}',"123456")	# {n}
# return: 123
匹配n-m个字符
ret=re.match('\d{1,3}',"123456") # {min,max}
# return: 123 [优先满足max]

元字符

匹配任一字符串
ret=re.match('q',"qwer")
# return: q
匹配任意字符('\n'除外)
ret=re.match('.+',"qwer\nt")	# .
# return: qwer
匹配任意的数字
ret=re.match('\d+',"13455erw")	# \d
# return: 13455
匹配任意的非数字
ret=re.match('\D+',".!~132")	# \D
# return: .!~
匹配空白字符(\n \t \r 空格)
ret=re.match('\s',"\n111")	# \s
print("$$$"+ret.group()+"$$$")
"""
return:
$$$
$$$
""" 
匹配非空白字符
ret=re.match('\S+',"11")	# \S
# return: 11
匹配[a-z]和[A-Z]、数字和下划线(Python定义变量的规则)
ret=re.match('\w+',"azAK_\nt")	# \w
print(ret.group()+"$$$")
# return: azAK_$$$
匹配除[a-z,A-Z,0-9,_ ]外的字符
ret=re.match('\W+',"\n\t123")	# \W
print("$$$"+ret.group()+"$$$")
"""
return: 
$$$
	$$$
"""
组合匹配
# 只要满足任意规则
ret=re.match('[\da-z]+',"132skLI~")	# []
# return: 132sk
取反匹配 | 行首字符 | 结尾字符
# 取反匹配
ret=re.match('[^\d]+',"abc~1")  # ^
# return: abc~

# 行首字符
ret=re.search("^abc","abcd") # 等同于re.search("abc","abcd")
# return: abc

# 结尾字符
ret=re.search("abc$","iiiabc")
# return: abc

# 匹配空字符
ret=re.search("^$","")	# 匹配以空字符开头和空字符结尾
# return: ""
匹配多个字符串或表达式
ret=re.search("ftp|http|https","https://edu.csdn.net/")
# return: http 按顺序进行匹配

贪婪模式和非贪婪模式

html=html = '<div class="navigation"><li<ahref="https://pass">账号设置</a></li></div> '

# 贪婪模式 
ret=re.search("<.+>",html) [会将开头出现的<和结尾出现的>相互匹配]
print(ret.group())
# return: <div class="navigation"><li<ahref="https://pass">账号设置</a></li></div>

# 非贪婪模式
ret=re.search("<.+?>",html) [匹配第一个出现的<第一个出现的>]
print(ret.group())
# return: <div class="navigation">

转义字符

Python中的转义字符
txt=r"This is \n" # 转义字符r
# return: This is \n
正则表达式的转义字符
ret=re.findall("a\*+","bca* lkfa*") # 匹配a*
# return: ['a*', 'a*']
原生字符串和正则表达式
ret=re.search("\\\\c","abc\c")
# return: \c

正则表达式的字符串解析规则:

  1. 先将字符串在Python语言层面中进行解析
  2. 将得到的结果再放到正则表达式层面中进行解析
\\\\c -->[Python语言层面] \\c -->[正则表达式层面] \c

笔记下载

https://download.csdn.net/download/weixin_45564816/85052061