正则表达式学习笔记:断言

正则表达式学习笔记

正向先行断言

在正则表达式中,(?=...) 是一个正向肯定预查(positive lookahead)的语法结构。它用于在匹配字符串时,查找某个位置后面是否跟着特定的模式,而不消耗实际的字符。

具体来说,(?=PM) 匹配一个数字序列(\d+),但该数字序列后面必须紧跟着字符串 “PM”。这种预查会在匹配的时候向前看,并确定某个位置后面是否满足预期的条件。

举个例子,假设有以下文本:

12PM 3PM 6PM

如果使用正则表达式 \d+(?=PM) 进行匹配,它将匹配到以下结果:

  • “12”:在 “12” 后面紧跟着 “PM”。
  • “3”:在 “3” 后面紧跟着 “PM”。
  • “6”:在 “6” 后面紧跟着 “PM”。

需要注意的是,正向肯定预查只是用来判断某个位置后面的模式是否匹配,它并不会包含在最终的匹配结果中。因此,预查部分(即 “PM”)不会包含在匹配的结果中,只有数字序列会被捕获。

import re
res = re.findall("\d+(?=PM)", "23PM 42ji")
print(res)
# ['23'] 

负向先行断言

负向先行断言(negative lookahead)是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置后面是否不跟着特定的模式。它与负向后行断言类似,但是用于否定条件。

负向先行断言的语法结构是 (?!...),其中 ... 表示要匹配的模式。

举个例子,假设我们想匹配一个字符串中不跟着 “xyz” 的数字序列。我们可以使用负向先行断言来实现这个目标。

正则表达式:\d+(?!xyz)

这个正则表达式会匹配一个或多个数字,但要求它后面不跟着 “xyz”。下面是一些例子来说明匹配情况:

  • “123”:匹配成功,因为它后面不是 “xyz”。
  • “456xyz”:不匹配,因为 “456” 后面是 “xyz”。
  • “789abc”:匹配成功,因为 “789” 后面不是 “xyz”。

负向先行断言允许我们在匹配过程中限制某个位置后面的内容,以满足特定的条件。

import re
res = re.findall("\d+(?!PM)", "23PM 42ji")
print(res)
# ['2', '42']

负向后行断言

负向后行断言是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置前面是否不跟着特定的模式。它类似于正向肯定预查,但是用于否定条件。

假设我们想匹配一个字符串中不紧跟着 “abc” 的 “def”。我们可以使用负向后行断言来实现这个目标。

正则表达式:(?<!abc)def

这个正则表达式会匹配 “def”,但是要求它前面的三个字符不是 “abc”。下面是一些例子来说明匹配情况:

  • “def”:匹配成功,因为它前面不是 “abc”。
  • “abcdef”:不匹配,因为 “def” 前面是 “abc”。
  • “xyzdef”:匹配成功,因为 “def” 前面不是 “abc”。

负向后行断言允许我们在匹配过程中限制某个位置前面的内容,以满足特定的条件。

import re
res = re.findall(r'(?<!abc)PM', "abcPM 23pm")
print(res)
# []

正向后行断言

正向后行断言(positive lookbehind)是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置之前是否跟着特定的模式。它类似于正向肯定预查,但是用于前面的条件。

正向后行断言的语法结构是 (?<=...),其中 ... 表示要匹配的模式。

举个例子,假设我们想匹配一个字符串中紧跟着 “abc” 的 “def”。我们可以使用正向后行断言来实现这个目标。

正则表达式:(?<=abc)def

这个正则表达式会匹配 “def”,但要求它前面的三个字符是 “abc”。下面是一些例子来说明匹配情况:

  • “abcdef”:匹配成功,因为 “def” 前面是 “abc”。
  • “xyzabcdef”:不匹配,因为 “def” 前面不是 “abc”。
  • “abcxyzdef”:不匹配,因为 “def” 前面不是紧跟着 “abc”。

正向后行断言允许我们在匹配过程中限制某个位置之前的内容,以满足特定的条件。需要注意的是,断言部分(即 “abc”)不会包含在最终的匹配结果中,只有断言后面的部分会被捕获。

import re
res = re.findall("(?<=23)\w+", "23PM 42ji")
print(res)

正则表达式学习笔记

正向先行断言

在正则表达式中,(?=...) 是一个正向肯定预查(positive lookahead)的语法结构。它用于在匹配字符串时,查找某个位置后面是否跟着特定的模式,而不消耗实际的字符。

具体来说,(?=PM) 匹配一个数字序列(\d+),但该数字序列后面必须紧跟着字符串 “PM”。这种预查会在匹配的时候向前看,并确定某个位置后面是否满足预期的条件。

举个例子,假设有以下文本:

12PM 3PM 6PM

如果使用正则表达式 \d+(?=PM) 进行匹配,它将匹配到以下结果:

  • “12”:在 “12” 后面紧跟着 “PM”。
  • “3”:在 “3” 后面紧跟着 “PM”。
  • “6”:在 “6” 后面紧跟着 “PM”。

需要注意的是,正向肯定预查只是用来判断某个位置后面的模式是否匹配,它并不会包含在最终的匹配结果中。因此,预查部分(即 “PM”)不会包含在匹配的结果中,只有数字序列会被捕获。

import re
res = re.findall("\d+(?=PM)", "23PM 42ji")
print(res)
# ['23'] 

负向先行断言

负向先行断言(negative lookahead)是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置后面是否不跟着特定的模式。它与负向后行断言类似,但是用于否定条件。

负向先行断言的语法结构是 (?!...),其中 ... 表示要匹配的模式。

举个例子,假设我们想匹配一个字符串中不跟着 “xyz” 的数字序列。我们可以使用负向先行断言来实现这个目标。

正则表达式:\d+(?!xyz)

这个正则表达式会匹配一个或多个数字,但要求它后面不跟着 “xyz”。下面是一些例子来说明匹配情况:

  • “123”:匹配成功,因为它后面不是 “xyz”。
  • “456xyz”:不匹配,因为 “456” 后面是 “xyz”。
  • “789abc”:匹配成功,因为 “789” 后面不是 “xyz”。

负向先行断言允许我们在匹配过程中限制某个位置后面的内容,以满足特定的条件。

import re
res = re.findall("\d+(?!PM)", "23PM 42ji")
print(res)
# ['2', '42']

负向后行断言

负向后行断言是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置前面是否不跟着特定的模式。它类似于正向肯定预查,但是用于否定条件。

假设我们想匹配一个字符串中不紧跟着 “abc” 的 “def”。我们可以使用负向后行断言来实现这个目标。

正则表达式:(?<!abc)def

这个正则表达式会匹配 “def”,但是要求它前面的三个字符不是 “abc”。下面是一些例子来说明匹配情况:

  • “def”:匹配成功,因为它前面不是 “abc”。
  • “abcdef”:不匹配,因为 “def” 前面是 “abc”。
  • “xyzdef”:匹配成功,因为 “def” 前面不是 “abc”。

负向后行断言允许我们在匹配过程中限制某个位置前面的内容,以满足特定的条件。

import re
res = re.findall(r'(?<!abc)PM', "abcPM 23pm")
print(res)
# []

正向后行断言

正向后行断言(positive lookbehind)是正则表达式的一种语法结构,用于在匹配字符串时,查找某个位置之前是否跟着特定的模式。它类似于正向肯定预查,但是用于前面的条件。

正向后行断言的语法结构是 (?<=...),其中 ... 表示要匹配的模式。

举个例子,假设我们想匹配一个字符串中紧跟着 “abc” 的 “def”。我们可以使用正向后行断言来实现这个目标。

正则表达式:(?<=abc)def

这个正则表达式会匹配 “def”,但要求它前面的三个字符是 “abc”。下面是一些例子来说明匹配情况:

  • “abcdef”:匹配成功,因为 “def” 前面是 “abc”。
  • “xyzabcdef”:不匹配,因为 “def” 前面不是 “abc”。
  • “abcxyzdef”:不匹配,因为 “def” 前面不是紧跟着 “abc”。

正向后行断言允许我们在匹配过程中限制某个位置之前的内容,以满足特定的条件。需要注意的是,断言部分(即 “abc”)不会包含在最终的匹配结果中,只有断言后面的部分会被捕获。

import re
res = re.findall("(?<=23)\w+", "23PM 42ji")
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值