TA的每日心情 | 无聊 5 天前 |
---|
签到天数: 1050 天 连续签到: 1 天 [LV.10]测试总司令
|
正则表达式可用于搜索、编辑和操作文本。Python RegEx 被几乎所有的公司广泛使用,并且对他们的应用程序具有良好的行业吸引力,从而使得正则表达式越来越受重视。
今天我们就一起来学习下 Python 正则表达式。
为什么要使用正则表达式。
为了回答这个问题,我们先来看看我们面临的各种问题,而这些问题又可以通过使用正则表达式来解决。
考虑以下场景:
文末有一个包含大量数据的日志文件,从这个日志文件中,希望只获取日期和时间。乍一看,日志文件的可读性是很低的。
在这种情况下,可以使用正则表达式来识别模式并轻松提取所需信息。
考虑下一个场景:你是一名销售人员,有很多电子邮件地址,其中很多地址都是假的/无效的,看看下面的图片:
我们可以做的是使用正则表达式,可以验证电子邮件地址的格式并从真实 ID 中过滤掉虚假 ID。
下一个场景与销售员示例的场景非常相似,考虑下图:
我们如何验证电话号码,然后根据原产国对其进行分类?
每个正确的数字都会有一个特定的模式,可以通过使用正则表达式来跟踪和跟踪。
接下来是另一个简单的场景:
我们有一个学生数据库,其中包含姓名、年龄和地址等详细信息。考虑一下地区代码最初是 59006 但现在已更改为 59076 的情况,这种情况为每个学生手动更新此代码将非常耗时且过程非常漫长。
基本上,为了使用正则表达式解决这些问题,我们首先从包含 pin 码的学生数据中找到一个特定的字符串,然后将它们全部替换为新字符串。
什么是正则表达式
正则表达式用于识别文本字符串中的搜索模式,它还有助于找出数据的正确性,甚至可以使用正则表达式进行查找、替换和格式化数据等操作。
考虑以下示例:
在给定字符串的所有数据中,假设我们只需要城市,这可以以格式化的方式转换为仅包含名称和城市的字典。现在的问题是,我们能否确定一种模式来猜测名称和城市?此外我们也可以找出年龄,随着年龄的增长,这很容易,对吧?它只是一个整数。
我们如何处理这个名字?如果你看一下这个模式,所有的名字都以大写字母开头。借助正则表达式,我们可以使用此方法识别姓名和年龄。
我们可以使用下面的代码:
- <font size="3">import re
- Nameage = '''
- Janice is 22 and Theon is 33
- Gabriel is 44 and Joey is 21
- '''
- ages = re.findall(r'd{1,3}', Nameage)
- names = re.findall(r'[A-Z][a-z]*',Nameage)
- ageDict = {}
- x = 0
- for eachname in names
- ageDict[eachname] = ages[x]
- x+=1
- print(ageDict)</font>
复制代码 Output:
- <font size="3"> {'Janice': '22', 'Theon': '33', 'Gabriel': '44', 'Joey': '21'}</font>
复制代码 正则表达式几个示例:
可以使用正则表达式执行许多操作。在这里,我列出了一些帮助更好地理解正则表达式的用法非常重要的内容。
让我们首先检查如何在字符串中找到特定单词
在字符串中查找一个单词
- <font size="3">import re
- if re.search("inform","we need to inform him with the latest information"):
- print("There is inform")</font>
复制代码 我们在这里所做的一切都是为了搜索单词 inform 是否存在于我们的搜索字符串中。
当然我们还可以优化以下代码:
- <font size="3"> import re
- allinform = re.findall("inform","We need to inform him with the latest information!")
- for i in allinform:
- print(i)</font>
复制代码 在这里,在这种特殊情况下,将找到两次infor。一个来自inform,另一个来自information。
如上所示,在正则表达式中查找单词就这么简单。
接下来我们将了解如何使用正则表达式生成迭代器。
生成迭代器
生成迭代器是找出并目标字符串的开始和结束索引的简单过程。考虑以下示例:
- <font size="3"> import re
- Str = "we need to inform him with the latest information"
- for i in re.finditer("inform.", Str
- locTuple = i.span()
- print(locTuple)</font>
复制代码 对于找到的每个匹配项,都会打印开始和结束索引。当我们执行上述程序时,输出如下:
- <font size="3"> (11, 18)
- (38, 45)</font>
复制代码 接下来我们将检查如何使用正则表达式将单词与模式匹配。
将单词与模式匹配
考虑一个输入字符串,我们必须将某些单词与该字符串匹配。要详细说明,请查看以下示例代码:
- <font size="3">import re
- Str = "Sat, hat, mat, pat"
- allStr = re.findall("[shmp]at", Str)
- for i in allStr:
- print(i)</font>
复制代码 字符串中有什么共同点?可以看到字母“a”和“t”在所有输入字符串中都很常见。代码中的 [shmp] 表示要查找的单词的首字母,因此,任何以字母 s、h、m 或 p 开头的子字符串都将被视为匹配,其中任何一个,并且最后必须跟在“at”后面。
Output:
- <font size="3"> hat
- mat
- pat</font>
复制代码 接下来我们将检查如何使用正则表达式一次匹配一系列字符。
匹配一系列字符范围
我们希望输出第一个字母应该在 h 和 m 之间并且必须紧跟 at 的所有单词。看看下面的例子,我们应该得到的输出是 hat 和 mat。
- <font size="3"> import re
- Str = "sat, hat, mat, pat"
- someStr = re.findall("[h-m]at", Str)
- for i in someStr:
- print(i)</font>
复制代码 Output:
- <font size="3"> hat
- mat</font>
复制代码 现在让我们稍微改变一下上面的程序以获得一个不同的结果
- <font size="3">import re
- Str = "sat, hat, mat, pat"
- someStr = re.findall("[^h-m]at", Str)
- for i in someStr:
- print(i)</font>
复制代码 发现细微差别了吗,我们在正则表达式中添加了插入符号 (^),它的作用否定了它所遵循的任何效果。我们不会给出从 h 到 m 开始的所有内容的输出,而是会向我们展示除此之外的所有内容的输出。
我们可以预期的输出是不以 h 和 m 之间的字母开头但最后仍然紧随其后的单词。Output:
- <font size="3">sat
- pat</font>
复制代码 替换字符串:
接下来,我们可以使用正则表达式检查另一个操作,其中我们将字符串中的一项替换为其他内容:
- <font size="3">import re
- Food = "hat rat mat pat"
- regex = re.compile("[r]at")
- Food = regex.sub("food", Food)
- print(Food)</font>
复制代码 在上面的示例中,单词 rat 被替换为单词 food。正则表达式的替代方法就是利用这种情况,它也有各种各样的实际用例。Output:
- <font size="3">hat food mat pat</font>
复制代码
|
|