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。
- 那么函数知道了之后,下一步就是书写pattern获取的修饰符。
- re --- 正则表达式操作 — Python 3.10.4 文档
- Python 正则表达式 | 菜鸟教程
- python | 史上最全的正则表达式_hurt--的博客-CSDN博客_python正则表达式 这个链接非常好。
- 下面对常用的几点进行介绍,后面再使用的再次补充:
- ()和[ ]以及{ } 和 | 的区别。()是里面由好几个表达式,一般里面是采用 |将好几个表达式隔开,如(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拼接起来替换,这太巧妙了,当然还可以给组命名,然后再后面第二个组匹配的时候依赖第一个组的匹配情况,这太爽了。