Python正则表达式

匹配单个字符

字符功能
.匹配任意1个字符(除了\n)
[ ]匹配[ ]中列举的字符
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配单词字符,即a-z、A-Z、0-9、_
\W匹配非单词字符

匹配多个字符 

字符功能
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现1次或者无限次,即至少有1次
?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m}匹配前一个字符出现m次
{m,n}匹配前一个字符出现从m到n次

匹配开头结尾

字符功能
^匹配字符串开头
$匹配字符串结尾
ret = re.match("([^-]*)-(\d+)","010-12345678") # ^这里是取反的意思

匹配分组

字符功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")

labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]
for label in labels:
    ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")

re模块的高级用法

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()
# 运行结果:9999

findall

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
# 运行结果:['9999', '7890', '12345']

sub 将匹配到的数据进行替换

def add(temp):
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)

ret = re.sub(r"\d+", add, "python = 997")
print(ret)
# 运行结果:python = 998

split 根据匹配进行切割字符串,并返回一个列表 

ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
# 运行结果:['info', 'xiaoZhang', '33', 'shandong']

python贪婪和非贪婪 

在"*","?","+","{m,n}"后面加上非贪婪操作符"?",使贪婪变成非贪婪,要求正则匹配的越少越好。

>>> s="This is a number 234-235-22-423"
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'

>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'

r的作用 

Python中字符串前面加上 r 表示原生字符串 

>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a

版权声明:本文为iayhvf原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。