正则表达式与re模块

一,正则表达式(http://tool.chinaz.com/regex/

正则表达式本身与python没什么关系,就是匹配字符串内容的一种规则,只和字符串相关。

定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符、及这些特殊字符的组合,组合一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

1,字符组,[字符组],在同一位置可能出现的各种字符组成一个字符组,在在正则表达式中用[]表示。

2,元字符:. , 匹配除换行符以外的任意字符

      w,匹配字符或数字或下划线,W,匹配非字母或下划线或数字

      s,匹配任意空白字符,S,匹配非空白字符

      d,匹配数字,         D,匹配非数字

      ,匹配一个换行符, ,匹配一个制表符,,匹配一个单词的结尾

      ^,匹配字符串的开始,$,匹配字符串的结尾,a|b,匹配字符a或字符b

      (),匹配括号内表达式,也表达一个组

      [...],匹配字符组中的字符,[^...],匹配除了字符组中字符的所有字符

3,量词

*,+,?,{n},{n,},{n,m},默认情况下,采用贪婪匹配。尽可能匹配长的字符串。

在量词后面加?,就是非贪婪匹配,尽可能匹配短的字符串。

转义符,python中,在字符串前加r,例r“d”

  .*?的用法:.*?x,就是取前面任意长度的字符,直到一个x出现

二,re模块

re模块下的常用方法

import re
# ret=re.findall("s","she is girs")   #返回所有满足匹配条件的结果,放在列表里
# print(ret)
# ret=re.search("s","zhe is girs").group() #函数会在字符串内查找,只找到第一个匹配,就返回一个包含信息的对象,该对象可以
# print(ret)                               #通过调用group()方法得到匹配的字符串,如果没有,则返回None,调用group会报错
# ret=re.match("a","zhe is girs")          #和search一样,但在字符串开始处匹配,匹配不到,就没有,报错
# print(ret.group())
# ret=re.split("[ab]","abdf")   #先按"a"分割得到""和"bdf",再对""和"bdf"分别按"b"分割,结果['', '', 'df']
# print(ret)                     #如果不加中括号,则按"ab"分割,结果['', 'df']
# ret=re.subn("d","r","we1rer23g4")   #将数字替换成"r",返回元组(替换的结果,替换了多少次(可设置))
# print(ret)
# see=re.compile("d{3}")            #将正则表达式编译成为一个正则表达式对象,规则要匹配的3个数字
# ret=see.search("asd34r345rr")
# print(ret.group())                    #345
# ret=see.sub("d","r","we1rer23g4",1)            #将数字替换成"r",参数1表示只替换一个
# print(ret)
# ret=re.finditer("d","da3gf4h4")           #finditer返回一个存放匹配结果的迭代器
# print(ret)               #<callable_iterator object at 0x000000A9CF8800F0>
# print(next(ret).group())
# print(next(ret).group())
# print([i.group()for i in ret])
# for i in ret:
#     print(i.group())

优先级

#findall的优先级
# ret=re.findall("www.(biadu|oldboy).com","www.oldboy.com")
# print(ret)         #['oldboy']      这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
#
# ret=re.findall("www.(?:biadu|oldboy).com","www.oldboy.com")
# print(ret)         #['www.oldboy.com']


# split的优先级
# ret=re.split("d","eva4your3yuan2she")
# print(ret)       #['eva', 'your', 'yuan', 'she']
# ret=re.split("(d)","eva4your3yuan2she")
# print(ret)       #['eva', '4', 'your', '3', 'yuan', '2', 'she']
# #在匹配部分加上()之后所切出来结果是不同的
# #没有()的没有保留所匹配的项,但有()的可以保留匹配的项

      

原文地址:https://www.cnblogs.com/glf1160/p/8252899.html