您的位置:

Python中使用负断言的技巧

正则表达式是一种简单而有力的文本处理工具,被广泛地应用在文本处理、爬虫、数据清洗等领域。在正则表达式中,断言是一个很重要的概念,可以帮助我们进行匹配和过滤。最近,我学习了Python中的负断言,并对其进行了深入的研究,发现这是一个非常有用的技巧。本文将从多个方面对Python中使用负断言的技巧进行详细阐述。

一、什么是负断言

在正则表达式中,断言是一个非常有用的概念,用于限定匹配的位置或条件。断言分为正断言和负断言,正断言表示匹配成功的条件,而负断言表示匹配失败的条件。本节主要介绍负断言。

当我们需要匹配某一字符串,但不包含另一个特定字符串时,就可以使用负断言。例如,需要匹配所有不包含"abc"的字符串:

import re

# 匹配不包含"abc"的字符串
str_list = ['xyz', '123', 'abc123', '124']
pattern = re.compile(r'^(?!.*abc).*$')
for s in str_list:
    if pattern.match(s):
        print(s)

输出结果:

xyz
123
124

正则表达式"(?!.*abc)"是一个负断言,表示当字符串中不包含"abc"时匹配成功。这个表达式的构成有两部分,一部分是"?!.",表示不以"."开始,也就是断言后面不跟任何字符;另一部分是".*abc",表示后面可以跟任意字符,但必须以"abc"结尾。

二、负断言的应用场景

负断言是一个非常有用的技巧,可以帮助我们在复杂的文本场景中进行匹配和过滤。接下来,我们将介绍负断言在几个具体应用场景中的使用技巧。

1. HTML文本中匹配特定标签之外的内容

在爬虫中,我们经常需要从HTML文本中提取出我们需要的信息,而过滤掉其他的内容。如果要提取特定标签之外的全部内容,就可以使用负断言。

import re

# 从HTML文本中提取p标签之外的全部内容
html = '''
  

这是第1段

这是第2段

这是第3段

''' pattern = re.compile(r'^(?!

).*$|^.*(?!

)$') result = pattern.findall(html) for r in result: print(r)

输出结果:

  

正则表达式^(?!<p>).*$|^.*(?!

)$表示,首先从开头到结尾匹配一次全文,如果遇到<p>标签,则不进行匹配;如果遇到</p>标签,则也不进行匹配。

2. 匹配两个字符之间,但不包含指定的字符

在一些场景中,我们需要匹配两个字符之间的所有内容,但不包含指定的字符。例如,匹配"【】"之间的所有内容,但不包含",":

import re

# 匹配【】之间的所有内容,但不包含,
s = '这是【中国,北京】和【美国,纽约】两个国家'
pattern = re.compile(r'【(?!,)(.*?)】')
result = pattern.findall(s)
for r in result:
    print(r)

输出结果:

中国
美国

正则表达式【(?!,)(.*?)】表示,先匹配"【"字符,然后(?!,)表示断言后面不是","字符,然后用"(.*?)"匹配中间的内容,最后再用"】"匹配结尾的"】"字符。

3. 匹配单词,但不包含指定的单词

在文本处理中,我们需要匹配单词,但有时需要排除一些指定的单词,这时可以使用负断言。

import re

# 匹配单词,但不包含hello
text = 'hello world, hello China, hello Beijing'
pattern = re.compile(r'\b(?!hello)\w+\b')
result = pattern.findall(text)
for r in result:
    print(r)

输出结果:

world
China
Beijing

正则表达式"\b(?!hello)\w+\b"表示,先用"\b"匹配单词的开头,然后(?!hello)表示断言后面不是"hello",再用"\w+"匹配中间的部分,最后用"\b"匹配单词的结尾部分。

三、负断言的总结

本文主要介绍Python中使用负断言的技巧。负断言可以帮助我们在复杂的文本场景中进行匹配和过滤,特别是在需要"不包含"某些特定字符或单词时非常有用。同时,我们也需要注意负断言的性能问题,不宜在大的文本中频繁使用。