正则表达式

一、元字符

1、简介

        后面跟元字符,去除元字符的特殊功能;跟普通字符,实现特殊功能;
  d  数字 十进制;相当于[0-9]
  D 非数字 相当于[^0-9]
  w 数字或字母 相当于[Aa-z-Z0-9]
  W 数字或字母 相当于[^Aa-z-Z0-9]
  s 空格 相当于[ fv]
  S 空格 相当于[^ fv]
   匹配一个单词边界,也就是指单词和空格间的位置
  - -
  . 除换行符之外的任意字符
  * 任意个字符 0到无穷
  + 至少一个 1到无穷
  ? 0个或1个
  {} 设置几个
  [] 里面的字符取一个
  A|B A或B
  ^ 以什么开头.[^2]代表除2之外的值
  $ 以什么结尾

2.注意事项

  ①数字 的作用 2的意思是,在2的位置是2组的内容
y = re.search(r"(wang)(duo)(qiu)2", "wangduoqiuduo").group()
print(y)

#结果wangduoqiuduo
  ② 匹配一个单词边界,也就是指单词和空格(特殊字符)间的位置
b=re.findall(r"wang","qiuwang duo")
print(b)
b=re.findall(r"wang","qiu wangduo")
print(b)

#结果['wang']  
        ['wang']
  ③注意这种情况  如果后面有限定条件,那么?不起作用
f1=re.findall(r"a(d+)b","a23b")
print(f1)
f2=re.findall(r"(ad+?)","a23b")
print(f2)

#结果 ['23']
['a2']

二、函数

1.简介

  ①.match  从头匹配
  ②.search 匹配第一个符合规则的字符串
  ③.findall 将匹配到的所有内容放在一个列表中
  ④.finditer
  ⑤.sub 替换
  ⑥.compile 编译某个方法
  ⑦.split

2.详细

  ①match: re.match(pattern,string,flags=0)

  flag的参数:
  re.I 使匹配对大小写不敏感
  re.L 做本地化识别匹配
  re.M 多行匹配,影响^和$
  re.S 使"."匹配包括换行在内的所有字符
  re.U
  re.X

 
search search(pattern, string, flags=0): 返回的是match对象,输出的时候加一个group才能输出
r=re.search(r"([0-9]*)([a-z]*)([0-9]*)","123abc456").groups()
print(r)
 
#结果('123', 'abc', '456')

match 和search匹配成功的话返回的都是一个match对象,下面写一下这个对象的功能
  start() 返回匹配开始的位置
  end() 返回匹配结束的位置
  sapn() 返回一个元组,包含匹配开始和匹配结束的位置
  group() 返回被re匹配的字符串
   group(n,m)返回组号为n,m所匹配的字符串
  groups() 获取匹配到的()中的所有结果,列为列表
  groupdict() 在(?P<n1>h) 输出结果为{n1:h}
    
f=re.match(r"(?P<wangduo>q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu").groupdict()
print(f)

#结果{'wangduo': 'q'}

  ③findall findall(pattern, string, flags=0)  

  取得是组里面的内容;在括号前面加一个?:代表去掉优先捕获,即可以取得全部的内容;如果没有括号,那么就是跟match一样;findall捕获的是match中groups中的内容

    #取得是组里面的内容
f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
print(f)

#结果['iu', 'iu', 'ic']
  #在括号前面加一个?:代表去掉优先捕获
f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
print(f)

#结果['qiuyu', 'qiuyu', 'qicyu']

  # 如果没有括号,那么就是跟match一样
f=re.findall(r"qw+yu","qiuyu wangduo qiuyu wangduo qicyu")
print(f)

#结果['qiuyu', 'qiuyu', 'qicyu']
  # findall捕获的是match中groups中的内容.不能加?P<>字典,怎样搞呢,见finditer
f=re.findall(r"(q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
print(f)

#结果[('q', 'iu'), ('q', 'iu'), ('q', 'ic')]
  # 括号中再加一个括号.只要有括号,就要提取。方向是从左到右,从外到内。
f=re.findall(r"(q)((w+)(u))(yu)","qiuyu wangduo qiuyu wangduo qicyu")
print(f)

#结果[('q', 'iu', 'i', 'u', 'yu'), ('q', 'iu', 'i', 'u', 'yu')]
  # 比较下面两个
f=re.findall(r"asd*","asdasd")
print(f)
f=re.findall(r"(?:asd)*","asdasd")
print(f)

#结果['asd', 'asd']
['asdasd', '']
  ④finditer

f3=re.finditer(r"(q)(?P<wang>w+)yu","qiuyu wangduo qiuyu wangduo qicyu")
for i in f3:
    a=i.group()
    print(a)
    b=i.groups()
    print(b)
    c=i.groupdict()
    print(c)

#结果
qiuyu
('q', 'iu')
{'wang': 'iu'}
qiuyu
('q', 'iu')
{'wang': 'iu'}
qicyu
('q', 'ic')
{'wang': 'ic'}
View Code
  ⑤sub 替换  re.sub(pattern,repl,string,max=0)  2代表替换前两个

s=re.sub("g.t","have","i gut a,i get b,i gct c",2)
print(s)
s,t=re.subn("g.t","have","i gut a,i get b,i gct c",2)
print(s,t)

#结果
i have a,i have b,i gct c
i have a,i have b,i gct c 2
View Code

  ⑥compile  compile(pattern, flags=0拿3findall来举例子
find = re.compile(r"qw+yu")
c = find.findall("qiuyu wangduo qiuyu wangduo qicyu")
print(c)

#结果['qiuyu', 'qiuyu', 'qicyu']

  ⑦spilt 分割(pattern, string, maxsplit=0(最多分割几次), flags=0)

  # 无分组()的时候,输出无分割元素
s="wang duo qiuyu qiuyu wang"
p=re.split("qw+",s,maxsplit=1)
print(p)

#结果['wang duo ', ' qiuyu wang']

  # 有分组的时候,输出有分割元素
s="wang duo qiuyu qiuyu wang"
p=re.split("(qw+)",s,maxsplit=1)
print(p)

#结果['wang duo ', 'qiuyu', ' qiuyu wang']

  # 计算器去括号

origin="((6*6+3)+(123+(456+459)*545+486)+156)"
def f1(x):
    """
    计算加减乘除
    """
    return 1
while True:
    print(origin)
    result = re.split(r"(([^()]+))",origin,1)
    if len(result)==3:
        # before=result[0]
        # center=result[1]
        # after=result[2]
        # 已经知道有三个元素,那么还可以这样写
        before,center,after=result
        r=f1(center)
        origin=before+str(r)+after

    else:
        print(f1(origin))
        break

#结果:
((6*6+3)+(123+(456+459)*545+486)+156)
(1+(123+(456+459)*545+486)+156)
(1+(123+1*545+486)+156)
(1+1+156)
1
1
View Code

3.杂货

# 杂货
# r'^d{3}-d{3,8}$ 加了r就不用考虑转义问题了。 以三个数字开头,-,以3-8个数字结尾
# 非贪婪模式,加一个?
原文地址:https://www.cnblogs.com/wangduoqiuyu/p/8552228.html