python算法(一)—正则表达式

python正则表达式这一块把内容有点多,不能一触而就,每次使用的时候记忆一点,之后基本就都记下来了。

在python里面使用正则表达式先要导入包 import re,之后首先要记住re里面经常用的函数,这里详细回忆一下。

  • re.compile()这个函数是根本的目的返回一个pattern。
  • re.match(pattern, str),从str头开始匹配,匹配到了返回(start_position, end_position),匹配不到返回None。
  • re.search(pattern, str),从整个str匹配,不是从头匹配,匹配到了就返回(start_position, end_position),只匹配一次。匹配不到返回None。
  • re.findall(pattern, str),从整个str匹配,返回所有匹配到的部分,构成一个list,匹配全部,没匹配到返回空列表。
  • re.finditer(pattren, str)从整个str匹配,返回所有匹配到的部分,构成一个迭代器,匹配全部。
  • re.sub(pattern,rep,  str, count=0),从整个str匹配,找到后用rep替换,全部匹配,但是替换几个是由count决定的,默认为0表示全部替换。参数比上面的统一模式少二个参数。
  • re.split(pattern, str),从整个str匹配,匹配之后按照匹配的分割,返回分割之后的list。
  1. 那么函数知道了之后,下一步就是书写pattern获取的修饰符。
  2. re --- 正则表达式操作 — Python 3.10.4 文档
  3. Python 正则表达式 | 菜鸟教程
  4. python | 史上最全的正则表达式_hurt--的博客-CSDN博客_python正则表达式 这个链接非常好。
  5. 下面对常用的几点进行介绍,后面再使用的再次补充:
  • ()和[ ]以及{ } 和 | 的区别。()是里面由好几个表达式,一般里面是采用 |将好几个表达式隔开,如(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致,匹配的是字段。[ ]里面虽然也是多种,一般是[0-9a-zA-Z]表示只要满足一个就行,所以个()本质的区别虽然都是或关系,但是[ ]只要获取一个字符,而()是获取一个字段。| 这个就表示或,二选一。{ }一般表示次数,{m}, {m, n}等等。<>无特殊意思,直接按照<>当作字母匹配。
  • 以上四个符号本身不匹配,仅仅是一种功能标识符。
  • ^从头开始匹配,&从尾开始匹配,.匹配任意字符。
  •  * + ?分别表示匹配当前字段次数是 >=0, >=1, 0|1,模式是贪婪模式,即尽可能多的匹配。只要后面加一个?,构成 *?,+?,??就变成最少匹配。
  • []和[^]的区别要知道,这个非常重要。注 | 在[ ]就不表示或了,而表示字符本身,这是个特殊的点。
  • 各种\字母(三种重要\d\s\w)是比较重要的。
  • 对于转义字符这里是非常重要的,转义字符主要是包含编译器编译的时候转义一次,代码解析的时候再次转义,使用r的话会屏蔽掉代码解析的那次转义,告诉编译器你编译的时候别动我,我这个r后面这个是一个整体。但正常匹配的话按照规定匹配就行了,要什么r里面写什么就行了,如果想匹配正则里面的特殊字符,此时就要再在r里面再写一个\,告诉解析的:我这里当作字符本身使用,而不当作转义字符使用。例子:我现在想匹配一个 \, 但是这个 \ 在编译器是转义的字符,在解析器也是转义的字符,所以如果直接不考虑编译器,只考虑解析器的话 r'\\'就可以了,但是如果不写r,那么就要考虑编译器对于当前字符是不是转义字符了,当前的 \是,所以就变成 \\\\了,看起来比较繁琐,所以一般都要屏蔽掉编译器,直接考虑解析器,使用r。 所以只需要记住解析器那些事特殊字符,如果匹配特殊字符本身,就需要加 \ ,由于屏蔽掉了编译器的转义字符,所以不必要记忆编译器的转义字符。

    功能字符 :     ‘.’ ‘*’ ‘+’ ‘|’ ‘?’ ‘^’ ‘$’ ‘\’ 等,它们有特殊的功能含义。特别是 ’\' 字符,它是转义引导符号,跟在它后面的字符一般有特殊的含义。

    规则分界符: ‘[‘ ‘]’ ‘ ( ’ ‘ ) ’ ‘{‘ ‘}’ 等,也就是几种括号了。

    预定义转义字符集: “\d”  “\w” “\s” 等等,它们是以字符 ’\’ 开头,后面接一个特定字符的形式,用来指示一个预定义好的含义。

    其它特殊功能字符: ’#’ ‘!’ ‘:’ ‘-‘ 等,它们只在特定的情况下表示特殊的含义。比如我现在想匹配'\d\n\'这几个字符,那么么就要写成  r'\d'

  • 那么当匹配到字符之后,每一个满足条件的字串都有四个自带的方法。start(), end(), span(), group(),前三个都好理解,不好理解的就是第四个,本来group是对于表达式里面有()的进行返回,意思是表达式里面有(),那么group就返回()匹配到的内容,加入表达式有3个括号,那么匹配到()里面的东西就返回为group(),获取每一个括号的呢内容,按照()的顺序依次group(1), group(2), group(3),可以发现没有group(0),系统设置group(0)式匹配到的真个串,当然包括三个括号,这是因为一个表达式不会只有三个(),一定还有别的内容,给与group(0)返回整个匹配到的字串,给与其余的group让我们灵活的调用匹配到的()里面的内容,所以目的式非常灵活的。所以对于没有()的表达式pattern,group(0)就表示匹配到的整个字串,这就是为什么没有表达式里面()也会有group()这个自带的函数。

  • 今天对于py的正则表达又有了新的认知,就是[]还是匹配单个字符,里面的内容是对单个字符范围的划定,里面也可以整多个匹配条件,可以直接并列着写,也可以直接用 | 隔开。所以[]里面可以写多个或条件,每一个条件都是对于一个字符范围的划定,不用添加 |。如[a-zA-Z0-9] = [a-z | A-Z | 0-9],也可以匹配多个字符,那么就需要写多个[][]了。

  • 而()组的概念,它里面是对于串的匹配,不是字符了,是字符串的匹配,所以它里面就可以写任意的基础模板,比如([a-zA-Z]+\w*?),之类的,那么前提就要知道各个基础的模板的作用,比如*?,+?,??都是非贪婪匹配,而单独的?却是只匹配0次或者1次。[^a]是除了a以外的都匹配,而单独的^却表示从头匹配。

  • 比较复杂的就是()*()?之类的,在组外面在进行基本的模板操作。

  • 还有最重要的一定就是匹配之后的组可以被外面捕获并结合替换。para = re.sub('([,。;.!~?\?])([^”’])', r"\1\n\2", para)  # 单字符断句符,这个\1就是捕获第一个组,\2捕获第二个组,然后把捕获的通过\n拼接起来替换,这太巧妙了,当然还可以给组命名,然后再后面第二个组匹配的时候依赖第一个组的匹配情况,这太爽了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值