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”。

Example of w+ and ^ Expression

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。

\s expression in re.split function

当您执行此代码时,它将给出输出 ['we', 'are', 'splitting', 'the', 'words']。

现在,让我们看看如果您从 s 中删除“\”会发生什么。输出中没有“s”字母,这是因为我们从字符串中删除了“\”,它将“s”评估为常规字符,因此在字符串中找到“s”的地方分割单词。

\s expression in re.split function

同样,还有一系列其他 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.match()

re.search(): 在文本中查找模式

re.search() 函数将搜索正则表达式模式并返回第一个匹配项。与 Python re.match() 不同,它将检查输入字符串的所有行。当找到模式时,Python re.search() 函数返回一个匹配对象;如果未找到模式,则返回“null”。

如何使用 search()?

为了使用 search() 函数,您需要先导入 Python re 模块,然后执行代码。Python re.search() 函数接受“模式”和要从中扫描的“文本”作为参数。

use 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() 方法。它将找到列表中的所有电子邮件地址。

 Use re.findall() in Python

这是 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”,而当您添加多行标志时,它将提取字符串中所有元素的第一个字符。

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)
  • 我们为字符串“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()
re.findall() 用于在字符串中查找模式的所有出现。

2. 在正则表达式中,\d 字符类代表什么?

  • 任何数字 (0-9)
  • 任何非数字字符
  • 任何空白字符
  • 任何字母或数字
\d 代表任何数字 (0-9)。

3. 您将使用哪个函数根据空格分割字符串?

  • re.split(r’\s’, string)
  • re.findall(r’\w+’, string)
  • re.match(r’\s+’, string)
  • re.split(r’\w+’, string)
re.split(r’\s’, string) 使用 \s 表达式根据空格分割字符串。

4. re.match() 和 re.search() 的主要区别是什么?

  • re.match() 在字符串开头查找模式,而 re.search() 在字符串中的任何位置查找模式。
  • re.match() 返回所有匹配项,而 re.search() 返回第一个匹配项。
  • re.search() 比 re.match() 快。
  • 这两个函数行为相同。
re.match() 在字符串开头查找模式,而 re.search() 在字符串中的任何位置查找模式。

摘要

编程语言 中,正则表达式是一种用于描述搜索模式的特殊文本字符串。它包括数字、标点符号以及 $#@!% 等所有特殊字符。表达式可以包含字面量

  • 文本匹配
  • 重复
  • 分支
  • 模式组合等。

在 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 等。