python 正则表达式

正则表达式定义:

      用事先定义好的一些特殊字符、及这些特点字符的组合,组成一个“规则字符串”,

      这个“规则字符串”用来表达对字符串的一种过滤逻辑。

常用的正则表达式的方法:

       re.compile(编译)

       pattern.match(从头找一个)

       pattern.search(找一个)

       pattern.findall(找所有)

       pattern.sub(替换)

 

pyre

 

  . 不能匹配 \n    当findall方法匹配不到结果时会返回一个空列表

 

当在DOTALL模式中也能匹配换行符。

添加一个参数即可

 

缩写,效果相同

 

反斜杠

与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。使用原生字符串写出来的表达式更直观。

\ 为转义字符,可以使后一个字符改变原来的意思如果希望  就代表其原本的含义,只需要在前面加上一个

第一个findall方法的点代表的是匹配所有字符,所以当然可以匹配到点

第二个findall方法的 .\  代表查找 点 所以匹配到点

 

[...]类似或的意思

a[bcd]e 可以匹配 abe ace ade 但是不可以匹配 abcde

可以使用 + 或者实现匹配

 

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

列表中有三个元素 此时和是否贪婪无关 是因为换行符的原因

点号匹配不到换行符 所以结束

 

贪婪效果:

列表只有一个元素,此时会尽可能的匹配 > 

 

非贪婪效果(尽可能少的匹配):

此时匹配到第一个 > 发现满足条件,返回一个结果,接着进行匹配所以有三个元素。

 

pattern.sub(替换)   \d 为数字    digit

 

re.compile() 

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

使用正则表达式进行匹配的流程

re_simple

在python执行到这一行时

re.sub("\d","_",b),python将能够匹配的结果全部读到内存,挨个和b进行匹配 

我们可以将其提前编译将能够匹配的结果预先放到内存中去,拿到编译之后的结果进行sub方法

这样我们就不用反复的去获取内存这样的操作 减少了耗时提高了效率

此时pattern中已经包含了正则表达式,所以已不需要提供正则表达式。

 

使用compile时re.S需要在编译时添加,在findall中添加无效果

 

原始字符串 r  

r 放在一个字符串前面表示一个原始的字符串

例如 \n 表示换行符 我们想表示原始的一个\ 和一个 n

可以 转义为 \\n   r"\n" 等效于 "\\n"

 

\n是一个字符

 

 

使用 r \ \\

 

使用原始字符串的好处:在正则表示式中使用 r ,我们可以忽略一个转义符号带来的转义的影响

 

使用 \\ 转义过于麻烦只在前面加 r 即可

补充:

re.findall(r"a.*bc","a\nbc",re.S)re.findall(r"a(.*)bc","a\nbc",re.S)的区别

不分组时匹配的是全部,分组时匹配的是组内的内容  即括号里面的内容

 

当我们需要ab中间的东西时可以加括号~     括号前后的内容用于定位和过滤的效果

 

match()  匹配 一个字符     

set = re.match(r"\d","55")   set.group()       ===>   返回5         匹配 0-9 单个字符

set = re.match(r"\d\d","5")    返回空对象  不满足规则  解决方案

set = re.match(r"\d{1,2}","5")   set.group()    ===>     返回  ‘5’

set = re.match(r"\d{1,2}","15")   set.group()    ===>     返回  ‘15’

set = re.match(r"\d{3}","15")  返回空对象 

set = re.match(r"\d{3}","1554846") set.group()    ===>     返回  ‘155’

re.match(r"[1-36-8]","5")  返回空对象

set =  re.match(r"[1-8a-d]","a")    set.group()    ===>     返回  ‘a’

set =  re.match(r"[1-8a-dA-Z]","B")    set.group()    ===>     返回  ‘B’

re.match(r"[1-8abcd]","e")  返回空对象

set =  re.match(r"\w","_")    set.group()    ===>     返回  ‘_’    \w   ---->   [0-9a-bA-Z] + 下划线_

python3 中 \w  支持中文匹配

 

* 0 1 多             ? 有  没有          +   至少1   (1  多 ) 

 这个不对   正则 aga# --》age  age#3# ---age \w还可能是中文

不可以  a#123   age!     取出来的 分别是 a  age 

正则匹配完,字符串也必须同时匹配完  $ 匹配字符串结束尾        ^  匹配字符串开头   python中  match 默认字符串开头判断

匹配4-20的163邮箱账号 

aaaaa@163Acom    . 需要转义

 

 

re. search   并不是从头开始匹配,匹配到数据就会返回  

 

re. findall  返回一个列表 不需要 group

 

re.sub  正则替换

参数可以直接调用函数

 

re.split  正则切割  返回列表

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值