王习然 发表于 2024-4-2 20:54:32

正则表达式

★ 正则表达式基本概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个 "规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑.★ 字符匹配


[*]单字符匹配

字符功能.匹配任意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次
[*]匹配开头结尾

字符功能^匹配字符串开头$匹配字符串结尾
[*]匹配分组

字符功能|匹配左右任意一个表达式(ab)将括号中字符作为一个分组\num引用分组num匹配到的字符串(?P)分组起别名(?P=name)引用别名为name分组匹配到的字符串
[*]基本使用

[*]案例1

import re

ret = re.match("([^-]*)-(\d+)","010-12345678")
print(ret.group())
print(ret.group(1))
print(ret.group(2))

# 运行结果:
'010-12345678'
'010'
'12345678'
[*]案例2

import re

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)
    if ret:
      print("%s 是符合要求的标签" % ret.group())
    else:
      print("%s 不符合要求" % label)
   
# 运行结果:
<html><h1>www.itcast.cn</h1></html> 是符合要求的标签
<html><h1>www.itcast.cn</h2></html> 不符合要求
[*]案例3

import re

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

# 运行结果:
'<html><h1>www.itcast.cn</h1></html>'

★ re 高级用法


[*]语法规则

[*]match(pattern,string): 匹配字符串的开头
pattern: 正则表达式
string: 要进行匹配的字符串
返回一个匹配对象
[*]search(pattern, string): 匹配字符串的任意位置
pattern: 正则表达式
string: 要进行匹配的字符串
返回一个匹配对象
[*]findall(pattern, string): 匹配所有符合条件的内容
pattern: 正则表达式
string:要进行匹配的字符串
返回所有符合条件的内容的列表
[*]sub(pattern, repl, string, count=0): 替换匹配到的内容
pattern: 正则表达式
repl:要替换成的内容
string:要进行替换的字符串
count:要替换的次数,默认为0,表示无限次
返回替换后的字符串
[*]split(pattern, string[,maxsplit]): 将匹配到的内容作为分割字符进行字符串的分割
pattern:正则表达式
string:要进行分割的字符串
maxsplit:最大分割次数
返回分割后的字符串列表

[*]案例演示

[*]search 使用

#coding=utf-8
import re

ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()

运行结果:
'9999'
[*]findall 使用

#coding=utf-8
import re

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)

运行结果:
['9999', '7890', '12345']
[*]sub 使用

#coding=utf-8
eg1:
import re

ret = re.sub(r"\d+", '998', "python = 997")
print(ret)

运行结果:
python = 998


eg2:
#coding=utf-8
import re

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

ret = re.sub(r"\d+", add, "python = 997")
print(ret)

ret = re.sub(r"\d+", add, "python = 99")
print(ret)

运行结果:
python = 998
python = 100

[*]贪婪与非贪婪

[*]基本概念
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
[*]案例演示
>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'

[*]r的作用

[*]使用演示
>>> mm = "c:\\a\\b\\c"
>>> mm
'c:\\a\\b\\c'
>>> print(mm)
c:\a\b\c
>>> re.match("c:\\\\",mm).group()
'c:\\'
>>> ret = re.match("c:\\\\",mm).group()
>>> print(ret)
c:\
>>> ret = re.match("c:\\\\a",mm).group()
>>> print(ret)
c:\a
>>> ret = re.match(r"c:\\a",mm).group()
>>> print(ret)
c:\a
>>> ret = re.match(r"c:\a",mm).group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>>
[*]使用总结
Python中字符串前面加上 r 表示原生字符串, 与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。


来源:https://www.cnblogs.com/cs-songbai/p/18111014
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 正则表达式