关于正则表达式的学习笔记和总结

关于正则表达式的学习笔记和总结

浅谈正则表达式

我有一个问题可以用正则表达式解决,好了现在我有两个问题了
为什么是正则表达式

在我个人的学习经历中接触过各种字符串查找函数,但为什么正则表达式这么神奇?我觉得是它的模糊性,它的模糊性决定了查找时无关元素的影响更小,更能找到需要的内容
用一段python代码举例

    str = "abcdef"
    res = str.find("a")

这个代码能帮助你找到字符串中a这个字符,但如果换个问题,在一堆电话号码中找某一个开头的电话,或者末尾是某一片段的电话号码,那么,find函数就没这么好用了。这时候,正则表达式的模糊性就能很好的得到需要的结果。

正则表达式的应用范围

正则表达式在java和python等语言中都有相应的包调用.在爬虫的使用中,正则表达式能很好的从一堆标签中找到你需要的某一段消息(虽然有时候在结构规整,目标不复杂的情况下,bs4有更好的效果).

正则表达式规则

元字符
  1. . :匹配除换行符之外的任意字符
  2. \w :匹配字母或数字或下划线或汉字
  3. \s :匹配任意空白符
  4. \d :匹配数字
  5. \b :匹配单词的开始或结束 如"er\b" 可以匹配never 不能匹配 very
  6. ^ :匹配输入字符串的开始
  7. $ :匹配输入字符串的结束
重复限定符
  1. * 重复零次或者多次
  2. + 重复一次或多次
  3. ?重复零次或一次
  4. {n} 重复n次
  5. {n,} 重复n次或者多次
  6. {n,m} 重复n次或者m次
分组符
  1. (ab) 表明以字符串"ab"为一组的元素,例如: "^(ab)+"匹配以零个或者多个"ab"开头的字符串
  2. [abc]或者[a-c] 表明匹配abc中任意一个的字符
转义符
  1. \ 表明将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。如:"(\n)"表示匹配\n "(\(ab\))+"表示匹配一个或者多个"(ab)"的字符
条件符
  1. | 条件或,满足前者或者后者的字符,例如"(12)(3|4)"匹配"123"或者"124"的字符
断言
  1. 正向先行断言表达式1(?=pattern)匹配pattern前面的表达式,不包含本身,例如下面的代码
import re
line = "<div class = \"left_box\" height = 100px>"
pattern = ".*(?=height)"
m = re.search(pattern,line)
print(m.group(0))
>>> <div class = "left_box" 
  1. 负向先行断言表达式1(?!pattern)匹配后面不含pattern的表达式,不包含本身,例如下面的代码
import re
line = "regular regex rlief"
pattern = r"r(\w{1})(?!g)"
m = re.search(pattern,line)
print(m.group(0))
>>> rl
  1. 正向后行断言(?<=pattern)表达式1,同正向先行断言,只是匹配的是pattern后面的表达式
  2. 负向向后行断言(?<!pattern)表达式1,同负向向先行断言,只是匹配的是pattern后面的表达式
懒惰(非贪婪)
什么是正则表达式的贪婪?

贪婪是指在匹配时尽可能多的匹配,如\w{2,9}则会尽量匹配9个,如果不够就匹配八个.

如何做到懒惰
  1. *?重复0次或者无数次,从0开始匹配
  2. +?重复一到正无穷次,从1开始
  3. ??重复0到1次,从0开始
  4. {n,m}? 重复n到m次,从n开始
编号分组

1.数字编号分组{表达式},例如:

import re
line = "020-85653333"
pattern = r"(0\d{2,3})-(\d{8})"
m = re.search(pattern,line)
m.group(0)
>>>020-85653333
m.group(1)
>>>020
m.group(2)
>>>85653333
  1. 命名编号捕获组(?<name>表达式),非捕获组()?:表达式,不捕获(在不同语言中实现方式不同,如在python中需要添加P在?与<name>之间)
import re
line = "020-85653333"
pattern = r"(?P<区号>0\d{2,3})-(?P<号码>\d{8})"
m = re.search(pattern,line)
m.group(0)
>>>020-85653333
m.group("号码")
>>>020
m.group("区号")
>>>85653333

import re
line = "020-85653333"
pattern = r"(?P<区号>0\d{2,3})-(?:\d{8})"
m = re.search(pattern,line)
m.group(0)
>>>020-85653333
m.group("号码")
>>>Error
m.group("区号")
>>>85653333

参考网站

正则表达式在线匹配网站:https://c.runoob.com/front-end/854/

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值