龙空技术网

python正则表达式“前向匹配与后向匹配”

slevnling 241

前言:

如今看官们对“正则正向匹配算法”大约比较关切,你们都需要知道一些“正则正向匹配算法”的相关内容。那么小编同时在网络上搜集了一些关于“正则正向匹配算法””的相关文章,希望你们能喜欢,咱们一起来学习一下吧!

在使用正则表达式进行字符串匹配时,经常会遇到需要取出匹配字符串前面的字符串(前向肯定)或者不符合规范的(前向否定),亦或取字符串前面(反向肯定、后向肯定)符合规范的或者不符合规范的(反向否定、后向否定),这就需要用到正则表达式的正向匹配与反向匹配。

前向匹配和后向匹配通常包括两部分匹配模型,一个称为预匹配,一个称为了正式匹配,语法格式类似:(?<=pattern1)pattern2(?=pattern3),其中pattern1和3为预匹配,主要用来定位匹配的开始位置和结束位置,pattern2为正式匹配,也就是符合要求的最终字符串的模型。

前向肯定匹配(?=pattern)

前向肯定匹配是指从目标字符串中与pattern匹配的字符串开始往前面查找符合要求的字符串,但返回结果不包含pattern匹配的字符串。

如:pattern=toutiao|jinri与目标字符串中的toutiao匹配成功,然后从此处(但不包括此处)开始向前面查找符合要求.*的字符串,即\.

import res = '\;m = re.search(r'.*(?=toutiao|jinri)',s)print(m.group())
输出:\.
后向肯定匹配(?<=pattern)

后向肯定匹配是指从目标字符串中与pattern匹配的字符串开始往后面查找符合要求的字符串,但返回结果不包含pattern匹配的字符串。

如:pattern=toutiao与目标字符串中的toutiao匹配成功,然后从此处(但不包括此处)开始向后面查找符合要求.*的字符串,即.com/

import res = '\;m = re.search(r'(?<=toutiao).*',s)print(m.group())
输出:.com/

注意:前向匹配的pattern的长度是可变的,可以包含*、+、?、.以及|之类的元字符,但是后向匹配的pattern只能是固定长度。

前向否定匹配(?!pattern)

前向否定匹配是指从目标字符串中任意不与pattern匹配的字符串开始往前面查找符合要求的字符串。

如:从目标字符串'\;中查找pattern为'\w+(?!toutiao)'子字符串,需要将toutiao和目标字符串逐个匹配,如果不匹配就从其目标字符串与pattern开始比较的地方的前面寻找符合要求的字符串,这里的要求是指\w+,即多个字母数字和下划线(贪婪模式),因此toutiao与目标字符串中:比较后,能够找到多个的字母数字和下划线。

import res = '\;m = re.search(r'\w+(?!toutiao)',s)print(m.group())
输出:https
后向否定匹配(?<!pattern)

后向否定匹配是指从目标字符串中任意不与pattern匹配的字符串开始往后面查找符合要求的字符串。

如:从目标字符串'\;中查找pattern为'(?<!gh:)\d+'子字符串,需要将gh:和目标字符串逐个匹配,如果不匹配就从其目标字符串与pattern开始比较的地方的后面寻找符合要求的字符串,这里的要求是指\d+,即多个十进制数(贪婪模式),因此gh:与目标字符串中/比较后,能够找到多个十进制数。

混合匹配

混合匹配就是前向匹配与后向同时使用

例如:文本<title>today is sunday</title>,现在要取出today is sunday,可以利用混合匹配编写正则表达式(?<=<title>).*(?=</title>)

import res = '<title>today is sunday</title>'m = re.search(r'(?<=<title>).*(?=</title>)',s)print(m.group())
总结

前向肯定匹配就是寻找匹配字符串前面的符合要求的子字符串;

后向肯定匹配就是寻找匹配字符串后面的符合要求的子字符串;

前向否定匹配就是寻找任意位置不匹配字符串前面的符合要求的子字符串;

后向否定匹配就是寻找任意位置不匹配字符串后面的符合要求的子字符串;

混合匹配就是将上面的匹配混合写在同一个正则表达式中;

标签: #正则正向匹配算法