51Testing软件测试论坛

标题: 干货ython正则表达式(内含源码) [打印本页]

作者: lsekfe    时间: 2022-9-28 10:32
标题: 干货ython正则表达式(内含源码)
正则表达式可用于搜索、编辑和操作文本。Python RegEx 被几乎所有的公司广泛使用,并且对他们的应用程序具有良好的行业吸引力,从而使得正则表达式越来越受重视。
  今天我们就一起来学习下 Python 正则表达式。
  为什么要使用正则表达式。
  为了回答这个问题,我们先来看看我们面临的各种问题,而这些问题又可以通过使用正则表达式来解决。
  考虑以下场景:
  文末有一个包含大量数据的日志文件,从这个日志文件中,希望只获取日期和时间。乍一看,日志文件的可读性是很低的。
[attach]143391[/attach]
在这种情况下,可以使用正则表达式来识别模式并轻松提取所需信息。
  考虑下一个场景:你是一名销售人员,有很多电子邮件地址,其中很多地址都是假的/无效的,看看下面的图片:

[attach]143392[/attach]
我们可以做的是使用正则表达式,可以验证电子邮件地址的格式并从真实 ID 中过滤掉虚假 ID。
  下一个场景与销售员示例的场景非常相似,考虑下图:

[attach]143393[/attach]
我们如何验证电话号码,然后根据原产国对其进行分类?
  每个正确的数字都会有一个特定的模式,可以通过使用正则表达式来跟踪和跟踪。
  接下来是另一个简单的场景:
  我们有一个学生数据库,其中包含姓名、年龄和地址等详细信息。考虑一下地区代码最初是 59006 但现在已更改为 59076 的情况,这种情况为每个学生手动更新此代码将非常耗时且过程非常漫长。
  基本上,为了使用正则表达式解决这些问题,我们首先从包含 pin 码的学生数据中找到一个特定的字符串,然后将它们全部替换为新字符串。
  什么是正则表达式
  正则表达式用于识别文本字符串中的搜索模式,它还有助于找出数据的正确性,甚至可以使用正则表达式进行查找、替换和格式化数据等操作。
  考虑以下示例:

[attach]143394[/attach]
在给定字符串的所有数据中,假设我们只需要城市,这可以以格式化的方式转换为仅包含名称和城市的字典。现在的问题是,我们能否确定一种模式来猜测名称和城市?此外我们也可以找出年龄,随着年龄的增长,这很容易,对吧?它只是一个整数。
  我们如何处理这个名字?如果你看一下这个模式,所有的名字都以大写字母开头。借助正则表达式,我们可以使用此方法识别姓名和年龄。
  我们可以使用下面的代码:

  1. <font size="3">import re

  2.   Nameage = '''

  3.   Janice is 22 and Theon is 33

  4.   Gabriel is 44 and Joey is 21

  5.   '''

  6.   ages = re.findall(r'd{1,3}', Nameage)

  7.   names = re.findall(r'[A-Z][a-z]*',Nameage)

  8.   ageDict = {}

  9.   x = 0

  10.   for eachname in names

  11.       ageDict[eachname] = ages[x]

  12.       x+=1

  13.   print(ageDict)</font>
复制代码
Output:
  1. <font size="3"> {'Janice': '22', 'Theon': '33', 'Gabriel': '44', 'Joey': '21'}</font>
复制代码
正则表达式几个示例:
  可以使用正则表达式执行许多操作。在这里,我列出了一些帮助更好地理解正则表达式的用法非常重要的内容。
  让我们首先检查如何在字符串中找到特定单词
  在字符串中查找一个单词

  1. <font size="3">import re

  2.   if re.search("inform","we need to inform him with the latest information"):

  3.       print("There is inform")</font>
复制代码
 我们在这里所做的一切都是为了搜索单词 inform 是否存在于我们的搜索字符串中。
  当然我们还可以优化以下代码:

  1. <font size="3"> import re

  2.     allinform = re.findall("inform","We need to inform him with the latest information!")

  3.     for i in allinform:

  4.       print(i)</font>
复制代码
在这里,在这种特殊情况下,将找到两次infor。一个来自inform,另一个来自information。
  如上所示,在正则表达式中查找单词就这么简单。
  接下来我们将了解如何使用正则表达式生成迭代器。
  生成迭代器
  生成迭代器是找出并目标字符串的开始和结束索引的简单过程。考虑以下示例:

  1. <font size="3"> import re

  2.   Str = "we need to inform him with the latest information"  

  3.   for i in re.finditer("inform.", Str

  4.       locTuple = i.span()

  5.       print(locTuple)</font>
复制代码
对于找到的每个匹配项,都会打印开始和结束索引。当我们执行上述程序时,输出如下:
  1. <font size="3"> (11, 18)

  2.   (38, 45)</font>
复制代码
接下来我们将检查如何使用正则表达式将单词与模式匹配。
  将单词与模式匹配
  考虑一个输入字符串,我们必须将某些单词与该字符串匹配。要详细说明,请查看以下示例代码:

  1. <font size="3">import re

  2.   Str = "Sat, hat, mat, pat"

  3.   allStr = re.findall("[shmp]at", Str)

  4.   for i in allStr:

  5.       print(i)</font>
复制代码
 字符串中有什么共同点?可以看到字母“a”和“t”在所有输入字符串中都很常见。代码中的 [shmp] 表示要查找的单词的首字母,因此,任何以字母 s、h、m 或 p 开头的子字符串都将被视为匹配,其中任何一个,并且最后必须跟在“at”后面。
  Output:

  1. <font size="3"> hat

  2.   mat

  3.   pat</font>
复制代码
接下来我们将检查如何使用正则表达式一次匹配一系列字符。
  匹配一系列字符范围
  我们希望输出第一个字母应该在 h 和 m 之间并且必须紧跟 at 的所有单词。看看下面的例子,我们应该得到的输出是 hat 和 mat。

  1. <font size="3"> import re

  2.   Str = "sat, hat, mat, pat"

  3.   someStr = re.findall("[h-m]at", Str)

  4.   for i in someStr:

  5.       print(i)</font>
复制代码
Output:
  1. <font size="3"> hat

  2.   mat</font>
复制代码
现在让我们稍微改变一下上面的程序以获得一个不同的结果
  1. <font size="3">import re

  2.   Str = "sat, hat, mat, pat"

  3.   someStr = re.findall("[^h-m]at", Str)  

  4.   for i in someStr:

  5.       print(i)</font>
复制代码
 发现细微差别了吗,我们在正则表达式中添加了插入符号 (^),它的作用否定了它所遵循的任何效果。我们不会给出从 h 到 m 开始的所有内容的输出,而是会向我们展示除此之外的所有内容的输出。
  我们可以预期的输出是不以 h 和 m 之间的字母开头但最后仍然紧随其后的单词。Output:

  1. <font size="3">sat

  2. pat</font>
复制代码
替换字符串:
  接下来,我们可以使用正则表达式检查另一个操作,其中我们将字符串中的一项替换为其他内容:

  1. <font size="3">import re

  2.   Food = "hat rat mat pat"

  3.   regex = re.compile("[r]at")

  4.   Food = regex.sub("food", Food)

  5.   print(Food)</font>
复制代码
在上面的示例中,单词 rat 被替换为单词 food。正则表达式的替代方法就是利用这种情况,它也有各种各样的实际用例。Output:
  1. <font size="3">hat food mat pat</font>
复制代码








欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2