Python 正则表达式中的零宽断言

2023-04-02 00:00:00 python 断言 正则表达式

正则表达式中的零宽断言(lookaround)是指一种不消耗字符串的匹配方式,它可以用来判断一个字符前面或后面是否满足某个条件,但并不包括这个字符本身。

零宽断言分为正向零宽断言和负向零宽断言两种,正向零宽断言用于匹配符合条件的位置,而负向零宽断言则用于匹配不符合条件的位置。常用的零宽断言包括:

  • (?=...) 正向零宽断言,表示断言后面紧跟的字符符合条件,但并不包括这个字符本身。
  • (?!...) 负向零宽断言,表示断言后面紧跟的字符不符合条件,但并不包括这个字符本身。
  • (?<=...) 正向零宽断言,表示断言前面紧靠的字符符合条件,但并不包括这个字符本身。
  • (?<!...) 负向零宽断言,表示断言前面紧靠的字符不符合条件,但并不包括这个字符本身。

下面是使用Python正则表达式中零宽断言的示例代码:

import re

# 正向零宽断言,匹配后面紧跟着的字符是.com的字符串
pattern1 = r'\w+(?=\.com)'
string1 = 'pidancode.com, pindan.com, pidan.net'
result1 = re.findall(pattern1, string1)
print(result1)  # ['pidancode']

# 负向零宽断言,匹配后面紧跟着的字符不是.com的字符串
pattern2 = r'\w+(?!\.com)'
string2 = 'pidancode.com, pindan.com, pidan.net'
result2 = re.findall(pattern2, string2)
print(result2)  # ['pindan', 'pidan', 'net']

# 正向零宽断言,匹配前面紧靠着的字符是pidan的后面跟着编程的字符串
pattern3 = r'(?<=pidan)编程'
string3 = 'pidan编程, 皮蛋编程, python编程'
result3 = re.findall(pattern3, string3)
print(result3)  # ['编程']

# 负向零宽断言,匹配前面紧靠着的字符不是pidan的后面跟着编程的字符串
pattern4 = r'(?<!pidan)编程'
string4 = 'pidan编程, 皮蛋编程, python编程'
result4 = re.findall(pattern4, string4)
print(result4)  # ['python编程']

以上代码中,re.findall() 函数用于在字符串中查找符合正则表达式的所有子串,并返回一个列表。使用零宽断言进行匹配时,需要使用 (?=...)、`(?!...)、(?<=...)、(?<!...) 这些语法来指定零宽断言。

示例中的第一个正则表达式 r'\w+(?=.com)' 使用了正向零宽断言,它的意思是匹配所有紧跟着 .com 后缀的单词字符。这里 \w+ 表示匹配一个或多个单词字符,(?=.com) 表示断言后面紧跟着 .com 后缀。

第二个正则表达式 r'\w+(?!.com)' 使用了负向零宽断言,它的意思是匹配所有不紧跟着 .com 后缀的单词字符。这里 (?!.com) 表示断言后面不紧跟着 .com 后缀。

第三个正则表达式 r'(?<=pidan)编程' 使用了正向零宽断言,它的意思是匹配所有紧靠着 pidan 的后面跟着 编程 的字符串。这里 (?<=pidan) 表示断言前面紧靠着 pidan。

第四个正则表达式 r'(?<!pidan)编程' 使用了负向零宽断言,它的意思是匹配所有不紧靠着 pidan 的后面跟着 编程 的字符串。这里 (?<!pidan) 表示断言前面不紧靠着 pidan。

在实际使用中,零宽断言可以提高正则表达式的匹配效率和精度,使得匹配更加灵活和准确。但需要注意的是,零宽断言只能匹配断言位置,不能匹配具体的字符,因此需要结合具体的正则表达式来使用。

相关文章