正则表达式(也称为 regex)是用于搜索和操作文本的极其强大的工具。Python 的正则表达式库 re 可以轻松匹配精确的字符串并执行其他类型的文本处理任务。在本文中,我们将探讨如何使用 re 库在 Python 中精确匹配字符串,并提供良好的实现示例。
什么是正则表达式?
正则表达式,通常缩写为“regex”,是计算机编程、文本处理和数据验证中用于匹配、搜索和操作文本模式的强大工具。本质上,正则表达式是定义搜索模式的字符序列。
此模式可用于匹配特定字符串、共享通用格式或结构的一组字符串,甚至可用于从较大的数据集中识别和提取某些数据片段。
正则表达式的语法根据实现和手头的具体任务而有所不同,但它通常涉及使用以某种方式使用时具有特殊含义的字符和元字符的组合。在开始使用 Python 正则表达式模块之前,让我们看看如何使用元字符或特殊序列实际编写正则表达式。
正则表达式中的元字符
正则表达式中使用的一些常见元字符包括:
元字符 | 描述 |
---|---|
. |
匹配除换行符之外的任何单个字符。 |
^ |
匹配字符串的开头。 |
$ |
匹配字符串的结尾。 |
* |
匹配零次或多次出现的前一个字符。 |
+ |
匹配一个或多个出现的前一个字符。 |
? |
匹配零次或一次出现的前一个字符。 |
{n} |
精确匹配前一个字符的 n 次出现。 |
{n,} |
匹配至少出现 n 次的前一个字符。 |
{n,m} |
前一个字符出现 n 到 m 次之间的匹配。 |
[] |
匹配括号内的任一字符。 |
[^] |
匹配不在括号内的任何一个字符。 |
() |
将字符序列分组在一起,以便与* 、+ 和 等元字符一起使用? 。 |
\ | 转义下一个字符,以便按字面意思处理它而不是元字符。例如,\. 匹配文字点,而不是任何字符。 |
正则表达式中的特殊序列
特殊序列与字符串中的实际字符不匹配,而是告诉搜索字符串中必须出现匹配的特定位置。它使编写常用模式变得更加容易。
顺序 | 描述 | 查询示例 | 输出 |
\A | 如果字符串以给定字符开头则匹配 | ‘\问’ | 用Python询问 |
\b | 如果单词以给定字符开头或结尾,则匹配。\b(string) 将 检查单词的开头,而 (string)\b 将检查单词的结尾。 |
‘\晒’ | 询问Python |
\V | 它与 \b 相反,即字符串不应以给定的正则表达式开头或结尾 | ‘\晒’ | 表,快 |
\d | 匹配任意十进制数字,相当于集合类[0-9] | ‘[a-zA_z]\d’ | 123、问2 |
\D | 匹配任意非数字字符,相当于集合类[^0-9] | ‘\D’ | 蟒蛇,启动 |
\s | 匹配任何空白字符。 | ‘\s’ | 作为 kpython |
\S | 匹配任何非空白字符 | ‘\S’ | A B C D |
\w | 匹配任何字母数字字符,这相当于类 [a-zA-Z0-9_]。 | ‘\w’ | 123 |
\W | 匹配任何非字母数字字符。 | ‘\W’ | >$ |
\Z | 如果字符串以给定的正则表达式结尾则匹配 | ‘ac\Z’ | 阿布法克 |
python 中的正则表达式模块
Python 中的模块regex
是一种替代正则表达式引擎,支持多种高级功能,例如递归模式、原子组和具有可变长度模式的后向断言。要安装该regex
模块,您可以使用pip
Python 包管理器。打开命令提示符或终端并输入以下命令:
pip install regex |
有关该模块的详细信息,请阅读:官方文档
如何在正则表达式中匹配整个字符串?
让我们直接了解可用于使用正则表达式匹配字符串的不同 Python 方法。
1.使用re.search()
该re.search
方法在给定字符串中搜索与指定正则表达式模式的匹配项。要匹配精确的字符串,您只需将字符串作为模式传递即可。例如:
import re text = "The quick brown fox" pattern = "quick" match = re.search(pattern, text) if match: print ( "Match found!" ) else : print ( "Match not found" ) |
Output: Match found! |
2.使用re.match()
该re.match
方法的工作方式与 类似re.search
,但仅匹配字符串开头的模式。要匹配精确的字符串,您可以使用^
和$
锚点来匹配字符串的开头和结尾。例如:
import re text = "The quick brown fox" pattern = "^The quick brown fox$" match = re.match(pattern, text) if match: print ( "Match found!" ) else : print ( "Match not found" ) |
Output:: Match found! |
3.使用re.fullmatch()
该re.fullmatch
方法将整个字符串与模式进行匹配。要匹配精确的字符串,您可以使用^
和$
锚点,就像 一样re.match
。例如:
import re text = "The quick brown fox" pattern = "^The quick brown fox$" match = re.fullmatch(pattern, text) if match: print ( "Match found!" ) else : print ( "Match not found" ) |
Output : Match found! |
4.使用re.findall()
该re.findall
方法查找字符串中模式的所有非重叠匹配项,并将它们作为列表返回。要匹配精确的字符串,您可以使用()
分组运算符围绕该字符串创建捕获组,然后使用反向引用再次匹配完全相同的字符串。例如,我们有一个文本文件,如下所示:
This is a sample text file. It contains some text that we will search using regular expressions. We can find specific patterns of text using regular expressions. |
我们可以使用Python的内置函数open
和read
函数将该文件读入字符串变量,然后使用正则表达式在文件中搜索特定的文本模式:
import re with open ( 'sample.txt' , 'r' ) as f: text = f.read() # Find all occurrences of the word "text" in the file matches = re.findall(r '\btext\b' , text) # Print the matches print (matches) |
Output : ['text', 'text', 'text'] |
在此示例中,我们首先sample.txt
使用该open
函数打开文件,使用该read
方法读取其内容,并将其分配给text
变量。然后,我们使用该re.findall
函数搜索字符串中单词“text”的所有非重叠出现,当单词“text”作为被单词边界包围的独立单词出现时,text
使用与单词“text”匹配的正则表达式模式。\btext\b
最后,我们将匹配列表打印到控制台。
另请阅读:如何在 Python 中使用正则表达式从文本文件中提取电子邮件
5.使用Pandas Series.str.extract()
Series.str
可用于以字符串形式访问Pandas 系列的值并对其应用多种方法。Pandas Series.str.extract()
函数用于提取正则表达式 pat 中的捕获组作为 DataFrame 中的列。为了展示这个例子,我们首先创建一个数据框:
import pandas as pd data = { "Name" : [ "John Doe" , "Jane Smith" , "Adam Johnson" ], "Age" : [ 32 , 25 , 42 ], "Email" : [ "johndoe@example.com" , "jane.smith@example.com" , "adam.j@example.com" ]} df = pd.DataFrame(data) # Extract the domain names from email addresses using regex df[ "Domain" ] = df[ "Email" ]. str .extract(r '@(\w+\.\w+)' ) print (df) |
Output Name Age Email Domain 0 John Doe 32 johndoe@example.com example.com 1 Jane Smith 25 jane.smith@example.com example.com 2 Adam Johnson 42 adam.j@example.com example.com |
概括
本文介绍了 Python 中的正则表达式及其用于匹配和操作文本字符串的用法。它涵盖了正则表达式中使用的语法和元字符,并演示了如何使用该re
模块对字符串执行各种操作,例如搜索、替换和拆分。