【Python爬虫开发基础②】Python基础(正则表达式)

您所在的位置:网站首页 自然数集为什么用z表示 【Python爬虫开发基础②】Python基础(正则表达式)

【Python爬虫开发基础②】Python基础(正则表达式)

2023-06-10 10:33| 来源: 网络整理| 查看: 265

友情提示:由于本专栏的文章偏向于爬虫,所以对于python的介绍不可能面面俱到,在这里只讲重点。 如果大家觉得有没讲到的地方,欢迎补充~

往期推荐:【Python爬虫开发基础①】Python基础(一) 上一篇文章已经讲了Python的基础变量类型,今天我们来看一下Python在爬虫开发时用的比较多的“正则表达式”

文章目录 1 什么是正则表达式2 正则表达式在Python中的使用2.1 re模块2.1.1 re.search()2.1.2 re.match()2.1.3 re.findall()2.1.4 re.sub() 2.2 regex模块 3 正则表达式的分类3.1 简单的元字符3.2 用于单字符匹配的元字符3.3 用于字符集匹配的元字符3.4 用于量词匹配的元字符3.5 用于分组匹配的元字符 4 正则表达式的等价5 贪婪匹配

1 什么是正则表达式

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是一种模式化的字符串,用于搜索、替换、分割和匹配文本数据。其基本思想是使用一些特殊的字符表示一个给定的模式,然后在文本中匹配这个模式。

正则表达式的作用:

匹配:判断给定的字符串是否符合正则表达式的过滤逻辑;获取子串:可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式的特点:

非常强的灵活性、逻辑性和功能性;可以迅速地用极简单的方式达到字符串的复杂控制。对于刚接触的人来说,比较晦涩难懂。 2 正则表达式在Python中的使用

在Python中,主要使用re模块和regex模块来实现正则表达式操作。下面分别进行详细的讲解。

2.1 re模块

Python的re模块(正则表达式)是一种强大和灵活的工具,用来进行对字符串的模式匹配、替换和分割操作。re模块可以用于处理各种字符数据,包括文本文件、日志文件、编程语言代码等。re模块中包含了大量的正则表达式函数,包括搜索、替换、分割、匹配、复制、提取等,可以帮助用户完成高效的文本处理任务。

注:Python自带了re模块,不需要额外安装。因此,使用re模块也非常方便,而无需像安装其他第三方库一样在终端中运行pip install命令。

2.1.1 re.search()

re.search()是Python re模块中常用的一个函数,用于在一个字符串中搜索指定的正则表达式模式。在搜索时,该函数会将整个字符串扫描一遍,直到找到第一个与模式匹配的字符串子串,然后返回一个匹配对象(Match Object)。如果没有找到相应的匹配子串,函数会返回None。

re.search()函数的常见用法如下:

match_object = re.search(pattern, string, flags=0)

其中,pattern参数表示要匹配的正则表达式,string参数表示要进行匹配的字符串,flags参数表示匹配选项(如是否忽略大小写等)。当函数返回一个匹配对象时,可以调用match_object.group()方法来获取匹配的子串,而该方法的参数表示要获取的子串的序号(如果正则表达式中有多个括号,每个括号表示一个组,其序号从左向右依次增加)。

例如,下面是一个示例代码,用于在一个字符串中搜索一个正则表达式:

import re text = "Python is a popular programming language" pattern = "programming" match_object = re.search(pattern, text) if match_object: print("Found a match:", match_object.group()) else: print("No match found.")

输出结果:

Found a match: programming 2.1.2 re.match()

在Python中,re.match()模块和re.search()模块类似,用于在字符串中搜索正则表达式的匹配项。但是,re.match()只会在字符串的开头进行匹配,如果在开头无法找到匹配项,它会返回一个None对象。因此,re.match()更适用于需要在字符串开头进行匹配的场景。

match的函数用法与search一样,下面来看一下同样的测试字符串,match返回的结果:

text = "Python is a popular programming language" pattern = "programming" match_object = re.match(pattern, text) if match_object: print("Found a match:", match_object.group()) else: print("No match found.")

输出:

No match found.

由于programming并不是第一个单词,所以无法匹配。

2.1.3 re.findall()

re.findall()是Python中re模块提供的另一种匹配模式的函数,它可以搜索字符串中所有匹配正则表达式的模式,并返回一个列表,列表中的每个元素都是与正则表达式匹配的子字符串。 与re.search()和re.match()不同,re.findall()会返回所有的匹配项,而不仅仅是第一个或最后一个匹配项。因此,如果您需要查找一个文本中所有匹配某个正则表达式的模式的情况,re.findall()是非常有用的函数。

以下是该函数的示例代码:

import re # 定义一个正则表达式,匹配以数字开头的子字符串 pattern = r'\d+' # 定义一个待匹配的字符串 text = "Today is Oct 15, 2021, and the temperature is 20 degrees Celsius." # 使用re.findall()函数查找所有匹配项,并将它们存储在一个list对象中 matches = re.findall(pattern, text) # 输出匹配结果 print(matches)

在这个示例中,我们首先定义一个正则表达式模式,r'\d+',用于匹配以数字开头的子字符串。然后,我们定义了一个待匹配的字符串,text。接下来,我们使用re.findall()函数查找所有匹配项,并将它们存储在一个list对象中,matches。最后,我们将匹配结果输出到屏幕上。

输出结果:

['15', '2021', '20']

这是因为,在示例中的文本中,有三个以数字开头的子字符串,分别是15、2021和20度。re.findall()函数找到它们,并将它们存储在一个list对象中。

2.1.4 re.sub()

re.sub()是Python re模块中提供的另一种匹配模式的函数,用于在字符串中对以某种模式匹配的子字符串进行替换。re.sub()函数返回一个新的字符串,其中所有匹配指定模式的子字符串都被替换为指定的内容。

下面是一个简单的代码示例,说明如何使用re.sub()进行字符串替换:

import re # 定义一个正则表达式,匹配所有'is'字符 pattern = 'is' # 定义一个待匹配的字符串 text = "The pattern of the book is not easy to find." # 使用re.sub()函数将匹配项替换为指定字符串 new_text = re.sub(pattern, "was", text) # 输出结果 print(new_text)

在这个示例中,我们首先定义了一个正则表达式模式,'is',用于匹配所有的is字符。然后,我们定义了一个待匹配的字符串,text。接下来,我们使用re.sub()函数将所有匹配项替换为"was"。最后,我们输出被替换后的新字符串。

输出:

The pattern of the book was not easy to find. 2.2 regex模块

除了标准库中的re模块,还有一些第三方正则表达式模块,例如regex模块,它提供了比re模块更加全面、高级和兼容Perl正则表达式语法的功能。

regex模块与re模块类似,提供了re模块中的大多数函数,但它支持更多的正则表达式语法和功能,例如复杂的断言、Unicode属性和匹配嵌套结构等。此外,regex模块的性能也比re模块更好,可以处理更大的正则表达式和更长的文本数据。

总之,Python中的正则表达式模块有很多,其中标准库中的re模块是最常用的。如果需要在处理正则表达式时需要更复杂的语法和功能,可以尝试使用regex模块。

3 正则表达式的分类

正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,也就是我们要用来做匹配的标记。

3.1 简单的元字符 元字符作用\将下一个字符标记符、或一个向后引用、或一个八进制转义符。^匹配输入字行首。$匹配输入行尾。(星号)*匹配前面的子表达式任意次。(加号)+匹配前面的子表达式一次或多次(大于等于1次)。?匹配前面的子表达式零次或一次。

示例代码:

import re # 匹配开头字符 res1 = re.match('^a', 'abandon') print(res1) # print(res1.group()) # a # 匹配结尾字符 res2 = re.match('.*d$', 'wood') print(res2) # print(res2.group()) # wood # 匹配至少出现一次的字符 res3 = re.match('a+', 'aabcd') print(res3) # print(res3.group()) # aa # 匹配一次或零次的字符 res4 = re.match('a?', 'aaabandon') print(res4) # print(res4.group()) # a 3.2 用于单字符匹配的元字符 元字符作用. (点)匹配除“\n”和"\r"之外的任何单个字符。\d匹配一个数字字符。\D匹配一个非数字字符。\f匹配一个换页符。\n匹配一个换行符。\r匹配一个回车符。\s匹配任何不可见字符,包括空格、制表符、换页符等等。\S匹配任何可见字符。\t匹配一个制表符。\w匹配包括下划线的任何单词字符。\W匹配任何非单词字符。

注:在元字符后面加一个加号(+)表示匹配一个或多个该类型字符

代码示例一(.):

# 指定要匹配的模式 pattern = "py." # 测试字符串1 test_str1 = "python" result1 = re.match(pattern, test_str1) print(result1) # 输出

代码示例二(\d、\D):

# 指定要匹配的模式 pattern = "\d" # 测试字符串2 test_str2 = "The price is 199.99 dollars" result2 = re.findall(pattern, test_str2) print(result2) # 输出['1', '9', '9', '9', '9'] # 指定要匹配的模式 pattern = "\D" # 测试字符串3 test_str3 = "My phone number is 555-1234" result3 = re.findall(pattern, test_str3) print(result3) # 输出 ['M', 'y', ' ', 'p', 'h', 'o', 'n', 'e', ' ', 'n', 'u', 'm', 'b', 'e', 'r', ' ', 'i', 's', ' ', '-']

代码示例四(\s、\S):

# 指定要匹配的模式 pattern1 = r"\s+" # 匹配一个或多个空白字符 pattern2 = r"\S+" # 匹配一个或多个非空白字符 # 测试字符串1 test_str1 = "Hello\tworld\n" result1 = re.findall(pattern1, test_str1) print(result1) # 输出 ['\t', '\n'] result2 = re.findall(pattern2, test_str1) print(result2) # 输出 ['Hello', 'world'] # 测试字符串2 test_str2 = " This is a demo. " result3 = re.findall(pattern1, test_str2) print(result3) # 输出 [' ', ' ', ' '] result4 = re.findall(pattern2, test_str2) print(result4) # 输出 ['This', 'is', 'a', 'demo.']

代码示例四(\w、\W):

# 指定要匹配的模式 pattern1 = r"\w+" # 匹配一个或多个单词字符 pattern2 = r"\W+" # 匹配一个或多个非单词字符 # 测试字符串1 test_str1 = "Hello, world!" result1 = re.findall(pattern1, test_str1) print(result1) # 输出 ['Hello', 'world'] result2 = re.findall(pattern2, test_str1) print(result2) # 输出 [', ', '!'] # 测试字符串2 test_str2 = "This is a demo." result3 = re.findall(pattern1, test_str2) print(result3) # 输出 ['This', 'is', 'a', 'demo'] result4 = re.findall(pattern2, test_str2) print(result4) # 输出 [' ', ' ', ' ', '.'] 3.3 用于字符集匹配的元字符 元字符作用[xyz]字符集合。匹配所包含的任意一个字符。

代码示例:

import re # 指定要匹配的模式 pattern1 = r"[aeiou]" # 匹配任何元音字母 pattern2 = r"[A-Z]" # 匹配任何大写字母 # 测试字符串1 test_str1 = "Hello, world!" result1 = re.findall(pattern1, test_str1) print(result1) # 输出 ['e', 'o', 'o'] # 测试字符串2 test_str2 = "This is a Demo." result2 = re.findall(pattern2, test_str2) print(result2) # 输出 ['T', 'D'] 3.4 用于量词匹配的元字符 元字符作用{n}n是一个非负整数。匹配确定的n次。{n,}n是一个非负整数。至少匹配n次。{n,m}m和n均为非负整数,其中n


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3