Python 正则表达式:带示例的 re.match()、re.search()、re.findall()
Python 中的正则表达式是什么?
在编程语言中,正则表达式 (RE) 是一种用于描述搜索模式的特殊文本字符串。它对于从代码、文件、日志、电子表格甚至文档等文本中提取信息非常有用。
在使用 Python 正则表达式时,首先要认识到一切本质上都是字符,我们编写模式来匹配特定字符序列,也称为字符串。ASCII 或拉丁字母是你键盘上的字母,Unicode 用于匹配外文文本。它包括数字、标点符号以及 $#@!% 等所有特殊字符。
例如,Python 正则表达式可以告诉程序搜索字符串中的特定文本,然后相应地打印结果。表达式可以包含
- 文本匹配
- 重复
- 分支
- 模式组合等。
Python 中的正则表达式或 RegEx (RE、regexes 或 regex pattern) 通过 re 模块导入。Python 通过库支持正则表达式。Python 中的 RegEx 支持修饰符、标识符和空白字符等各种内容。
标识符 | 修饰符 | 空白字符 | 需要转义 |
---|---|---|---|
\d= 任何数字(一位数字) | \d 表示一位数字。例如:\d{1,5} 它将声明 1 到 5 位数字,如 424、444、545 等。 | \n = 新行 | . + * ? [] $ ^ () {} | \ |
\D= 任何非数字(非数字字符) | + = 匹配 1 次或多次 | \s= 空格 | |
\s = 空格 (制表符、空格、换行符等) |
? = 匹配 0 次或 1 次 | \t = 制表符 | |
\S= 任何非空格字符 | * = 匹配 0 次或多次 | \e = 转义符 | |
\w = 字母(匹配字母数字字符,包括“_”) | $ 匹配字符串的结尾 | \r = 回车 | |
\W= 任何非字母字符(匹配非字母数字字符,不包括“_”) | ^ 匹配字符串的开头 | \f= 换页符 | |
. = 任何字符(除了换行符,表示小数点) | | 匹配 x 或 y | —————– | |
\b = 除换行符外的任何字符 | [] = 范围或“变体” | —————- | |
\. | {x} = 指定前面代码出现的次数 | —————– |
正则表达式 (RE) 语法
import re
- “re”模块包含在 Python 中,主要用于字符串搜索和操作
- 也经常用于网页“抓取”(从网站提取大量数据)
我们将从这个简单的练习开始学习表达式教程,使用表达式 (w+) 和 (^)。
w+ 和 ^ 表达式示例
- “^”:此表达式匹配字符串的开头
- “w+“:此表达式匹配字符串中的字母数字字符
这里我们将看到一个 Python RegEx 示例,说明我们如何在代码中使用 w+ 和 ^ 表达式。在本教程后面我们将介绍 Python 中的 re.findall() 函数,但目前我们只关注 \w+ 和 \^ 表达式。
例如,对于我们的字符串“guru99, education is fun”,如果执行包含 w+ 和^ 的代码,它将给出输出“guru99”。
import re xx = "guru99,education is fun" r1 = re.findall(r"^\w+",xx) print(r1)
请记住,如果从 w+ 中删除 + 号,输出将发生变化,它只会给出第一个字母的第一个字符,即 [g]
re.split 函数中 \s 表达式示例
- “s”:此表达式用于在字符串中创建空格
为了理解 Python 中的 RegEx 如何工作,我们从一个简单的 Python RegEx 示例开始,介绍 split 函数。在示例中,我们使用“re.split”函数分割每个单词,同时使用允许单独解析字符串中每个单词的表达式 \s。
当您执行此代码时,它将给出输出 ['we', 'are', 'splitting', 'the', 'words']。
现在,让我们看看如果您从 s 中删除“\”会发生什么。输出中没有“s”字母,这是因为我们从字符串中删除了“\”,它将“s”评估为常规字符,因此在字符串中找到“s”的地方分割单词。
同样,还有一系列其他 Python 正则表达式,您可以在 Python 中以各种方式使用它们,例如 \d, \D, $, \., \b 等。
这是完整的代码
import re xx = "guru99,education is fun" r1 = re.findall(r"^\w+", xx) print((re.split(r'\s','we are splitting the words'))) print((re.split(r's','split the words')))
接下来,我们将看到 Python 中用于正则表达式的方法类型。
使用正则表达式方法
“re”包提供了几种在输入字符串上执行查询的方法。我们将看到 Python 中 re 的方法
- re.match()
- re.search()
- re.findall()
注意:基于正则表达式,Python 提供了两种不同的基本操作。match 方法仅在字符串开头检查匹配项,而 search 检查字符串中的任何位置的匹配项。
re.match()
Python 中的“re”函数 re.match() 将搜索正则表达式模式并返回第一个匹配项。Python RegEx Match 方法仅在字符串开头检查匹配项。因此,如果在第一行找到匹配项,则返回匹配对象。但如果匹配项在其他行中找到,Python RegEx Match 函数将返回 null。
例如,考虑以下 Python re.match() 函数代码。表达式“w+”和“\W”将匹配以字母“g”开头的单词,之后,任何不以“g”开头的单词都不会被识别。要检查列表中或字符串中每个元素的匹配项,我们在 Python re.match() 示例中运行 forloop。
re.search(): 在文本中查找模式
re.search() 函数将搜索正则表达式模式并返回第一个匹配项。与 Python re.match() 不同,它将检查输入字符串的所有行。当找到模式时,Python re.search() 函数返回一个匹配对象;如果未找到模式,则返回“null”。
如何使用 search()?
为了使用 search() 函数,您需要先导入 Python re 模块,然后执行代码。Python re.search() 函数接受“模式”和要从中扫描的“文本”作为参数。
例如,在这里我们在文本字符串“Software Testing is fun”中查找两个字面字符串“Software testing”和“guru99”。对于“software testing”,我们找到了匹配项,因此它返回 Python re.search() 示例的输出“found a match”,而对于单词“guru99”,我们在字符串中找不到它,因此它返回输出“No match”。
re.findall()
findall() 模块用于搜索匹配给定模式的“所有”出现。相反,search() 模块将仅返回匹配指定模式的第一个出现。findall() 将迭代文件的所有行,并一次性返回模式的所有非重叠匹配。
如何在 Python 中使用 re.findall()?
这里我们有一个电子邮件地址列表,我们希望从列表中获取所有电子邮件地址,我们在 Python 中使用 re.findall() 方法。它将找到列表中的所有电子邮件地址。
这是 re.findall() 示例的完整代码
import re list = ["guru99 get", "guru99 give", "guru Selenium"] for element in list: z = re.match("(g\w+)\W(g\w+)", element) if z: print((z.groups())) patterns = ['software testing', 'guru99'] text = 'software testing is fun?' for pattern in patterns: print('Looking for "%s" in "%s" ->' % (pattern, text), end=' ') if re.search(pattern, text): print('found a match!') else: print('no match') abc = 'guru99@google.com, careerguru99@hotmail.com, users@yahoomail.com' emails = re.findall(r'[\w\.-]+@[\w\.-]+', abc) for email in emails: print(email)
Python 标志
许多 Python Regex 方法和 Regex 函数接受一个可选参数,称为 Flags。这些标志可以修改给定 Python Regex 模式的含义。为了理解这些,我们将看到这些标志的一两个示例。
Python 中使用的各种标志包括
Regex 标志的语法 | 此标志的作用 |
---|---|
[re.M] | 使开始/结束考虑每一行 |
[re.I] | 忽略大小写 |
[re.S] | 使 [ . ] |
[re.U] | 使 { \w,\W,\b,\B} 遵循 Unicode 规则 |
[re.L] | 使 {\w,\W,\b,\B} 遵循本地化设置 |
[re.X] | 允许在 Regex 中添加注释 |
re.M 或多行标志示例
在多行模式中,模式字符 [^] 匹配字符串的第一个字符以及每一行的开头(紧跟在每个换行符之后)。而小写字母“w”用于标记字符之间的空格。当您运行代码时,第一个变量“k1”仅打印单词 guru99 中的字符“g”,而当您添加多行标志时,它将提取字符串中所有元素的第一个字符。
这是代码
import re xx = """guru99 careerguru99 selenium""" k1 = re.findall(r"^\w", xx) k2 = re.findall(r"^\w", xx, re.MULTILINE) print(k1) print(k2)
- 我们为字符串“guru99…. careerguru99….selenium”声明了变量 xx
- 运行代码而不使用多行标志,它仅从行中输出“g”
- 运行带有“multiline”标志的代码,当您打印‘k2’时,它会输出“g”、“c”和“s”
- 因此,在上面的示例中,我们可以在添加多行前后看到区别。
同样,您也可以使用其他 Python 标志,如 re.U (Unicode)、re.L (遵循本地化)、re.X (允许注释) 等。
Python 2 示例
以上代码是 Python 3 示例,如果您想在 Python 2 中运行,请参考以下代码。
# Example of w+ and ^ Expression import re xx = "guru99,education is fun" r1 = re.findall(r"^\w+",xx) print r1 # Example of \s expression in re.split function import re xx = "guru99,education is fun" r1 = re.findall(r"^\w+", xx) print (re.split(r'\s','we are splitting the words')) print (re.split(r's','split the words')) # Using re.findall for text import re list = ["guru99 get", "guru99 give", "guru Selenium"] for element in list: z = re.match("(g\w+)\W(g\w+)", element) if z: print(z.groups()) patterns = ['software testing', 'guru99'] text = 'software testing is fun?' for pattern in patterns: print 'Looking for "%s" in "%s" ->' % (pattern, text), if re.search(pattern, text): print 'found a match!' else: print 'no match' abc = 'guru99@google.com, careerguru99@hotmail.com, users@yahoomail.com' emails = re.findall(r'[\w\.-]+@[\w\.-]+', abc) for email in emails: print email # Example of re.M or Multiline Flags import re xx = """guru99 careerguru99 selenium""" k1 = re.findall(r"^\w", xx) k2 = re.findall(r"^\w", xx, re.MULTILINE) print k1 print k2
测试你的 Python 知识
1. 哪个方法用于在字符串中查找模式的所有出现?
- re.search()
- re.match()
- re.findall()
- re.split()
2. 在正则表达式中,\d 字符类代表什么?
- 任何数字 (0-9)
- 任何非数字字符
- 任何空白字符
- 任何字母或数字
3. 您将使用哪个函数根据空格分割字符串?
- re.split(r’\s’, string)
- re.findall(r’\w+’, string)
- re.match(r’\s+’, string)
- re.split(r’\w+’, string)
4. re.match() 和 re.search() 的主要区别是什么?
- re.match() 在字符串开头查找模式,而 re.search() 在字符串中的任何位置查找模式。
- re.match() 返回所有匹配项,而 re.search() 返回第一个匹配项。
- re.search() 比 re.match() 快。
- 这两个函数行为相同。
摘要
在 编程语言 中,正则表达式是一种用于描述搜索模式的特殊文本字符串。它包括数字、标点符号以及 $#@!% 等所有特殊字符。表达式可以包含字面量
- 文本匹配
- 重复
- 分支
- 模式组合等。
在 Python 中,正则表达式表示为 RE (REs, regexes 或 regex pattern),它们通过 Python re 模块嵌入。
- “re”模块包含在 Python 中,主要用于字符串搜索和操作
- 也经常用于网页“抓取”(从网站提取大量数据)
- Python 正则表达式方法包括 re.match()、re.search() 和 re.findall()
- 其他 Python RegEx 替换方法是 sub() 和 subn(),它们用于在 re 中替换匹配的字符串
- Python 标志 许多 Python Regex 方法和 Regex 函数接受一个可选参数,称为 Flags
- 这些标志可以修改给定 Regex 模式的含义
- Regex 方法中使用的各种 Python 标志有 re.M、re.I、re.S 等。