0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Python中使用正则表达式的一些基本语法演示

jf_ZqFkd6Up 来源:Linux迷 2023-04-15 16:32 次阅读

每当你遇到文本处理问题时,正则表达式(regex)总是你的好朋友。 然而,要记住所有复杂的规则是很难的甚至是不可能的。甚至仅仅阅读语法也是令人不知所措的。

因此,学习正则表达式的最佳方法是通过学习实际示例。 本文将总结日常编程场景中常用的 9 个正则表达式技巧。阅读完后,正则表达式对你来说就像喝杯茶一样简单。

验证电子邮件地址

检查电子邮件地址的有效性是正则表达式的经典用例。 下面是一个示例程序:


import re
def val_email(email):
    pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z]{2,}$"
    if re.match(pattern, email):
        print("合法的邮件地址:)")
    else:
        print("无效的邮件地址!!")


val_email(email="elon@example.com")
# 合法的邮件地址:)
val_email(email="elonexample.com")
# 无效的邮件地址!!
val_email(email="elon@example.c")
# 无效的邮件地址!!
在这个例子中,我们使用 Python 中的 re 模块来编译一个匹配有效电子邮件格式的正则表达式模式。然后,我们使用它的 match() 函数来检查 email 变量是否与模式匹配。 在模式中,有几个关键点:

我们使用 [] 表示一个范围。例如,[a-zA-Z0-9] 可以匹配 0 到 9 之间的数字、A 到 Z 之间的字母或 a 到 z 之间的字母。

^ 表示行的开头。在我们的例子中,我们使用它来确保文本必须以 [a-zA-Z0-9] 开始。

$ 表示行的结尾。

用于转义特殊字符(允许我们匹配像 '.' 这样的字符)。

{n,m} 语法是用来匹配 n-m 个先前的正则表达式。我们使用了 {2,},这意味着前面的部分 [a-zA-Z] 应该至少重复 2 次。这就是为什么 "elon@example.c" 被识别为无效的电子邮件地址。

表示匹配前面的正则表达式至少 1 次。例如,ab+ 将匹配 a 后面的任何非零数量的 b。

这个经典的例子演示了在 Python 中使用正则表达式的一些基本语法。 实际上,Python 的 re 模块是一个隐藏的宝藏,我们可以从中使用许多更多的技巧。

从字符串中提取数字

要从长文本中找到一些特殊字符,最直接的想法是使用 for 循环遍历所有字符并找到所需的内容。 但是,没有必要使用任何循环。正则表达式就是为了作为过滤器而生的。



import re


def extract_numbers(text):
    pattern = r"d+"
    return re.findall(pattern, text)


print(extract_numbers("Linux迷的文章阅读量超过100000000。"))
# ['100000000']

pYYBAGQ6YV-AH4wvAAEUQCCbD50996.jpg

如上所示,re.findall() 函数接收一个正则表达式和一个文本,可以方便地帮助我们找到所有我们需要的字符。 其中 d 用于在正则表达式中匹配数字。 接下来我们看一个具体例子,演示 d 的用途。

验证电话号码

下面的例子利用了 d 的用法来验证有效的电话号码:


import re


def is_valid_phone_number(phone_number):
    pattern = r"^d{3}-d{3}-d{4}$"
    return bool(re.match(pattern, phone_number))


print(is_valid_phone_number("123-456-7890"))  # True
print(is_valid_phone_number("1234567890"))  # False
除了 d 外,我们还使用了 ^、$ 和 {n} 语法来确保字符串是一个有效的电话号码。

将文本分割成单词

将长文本分割成单独的单词是日常编程中的另一个常见需求。借助 re 模块的 split() 函数,我们可以轻松完成此任务:


>>> re.split(r's+', 'a b   c')
# ['a', 'b', 'c']


>>> re.split(r'[s,]+', 'a,b, c  d')
# ['a', 'b', 'c', 'd']


>>> re.split(r'[s,;]+', 'a,b;; c  d')
['a', 'b', 'c', 'd']
如上述代码所示,我们使用 s 来在正则表达式中匹配一个空格。

使用正则表达式查找和替换文本

在使用正则表达式从文本中找到特定字符后,我们可能需要用新的字符串来替换它们。 re 模块的 sub() 函数可以使这个过程变得非常顺畅:


import re


text = "linuxmi is an full-stack software engineer."
pattern = r"[a-e]"
replacement = "*"


new_text = re.sub(pattern, replacement, text)
print(new_text)  
#linuxmi is *n full-st**k softw*r* *ngin**r.
poYBAGQ6YX6AVoA9AAEqbakAopQ682.jpg

如上所示,我们只需要将三个参数传递给sub()函数:模式、替换字符串和原始文本。它将在执行后返回新文本。

在Python中预编译正则表达式

在Python中使用正则表达式匹配字符串时,有两个步骤: 编译正则表达式。使用编译后的正则表达式匹配字符串。因此,如果一个正则表达式被重复使用,每次编译都会浪费时间。 为了避免这种情况,Python允许我们预先编译一个正则表达式,然后重复使用编译后的对象进行后续匹配。这可以显著提高性能和效率。


import re
re_numbers = re.compile(r'^d+$')
print(re_numbers.match('123'))
# 
print(re_numbers.match('linuxmi'))
# None
上面的例子展示了如何使用re模块中的compile()函数预编译正则表达式并稍后使用它。只要字符串无法匹配正则表达式,match()函数就会返回None。

提取和操作文本的子内容

group()方法是Python re模块中的一个函数,它返回一个或多个匹配的正则表达式匹配对象的子组。它非常方便,用于提取文本的不同部分。 例如,以下代码展示了如何从“HH:MM”格式的时间字符串中提取两个部分:


import re


time='21:37'


matched = re.match(r'^(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])$', time)


print(matched.groups())
# ('21', '37')
print(matched.group())
# '21:37' 
print(matched.group(0)) 
# '21:37'
print(matched.group(1))
# '21'
print(matched.group(2))
# '37'
pYYBAGQ6YZaANCreAAEP03FuiLg171.jpg

如上所示,group(0) 返回原始字符串。然后,group(1) 和 group(2) 分别返回匹配字符串的第一部分和第二部分。

用于提取子内容的命名分组

如果子组数量变得很多,由于太多的神奇数字,程序将很难阅读。 因此,Python 提供了用于子内容提取的命名组技巧:我们可以使用命名组捕获匹配字符串的特定部分,而不是使用编号的捕获组。这可以使我们的代码更易于阅读和维护。 以下是一个例子:



import re


text = "linuxmi, age 27"
pattern = r"(?Pw+),sages(?Pd+)"


match = re.search(pattern, text)


print(match.group("name"))  
# linuxmi
print(match.group("age"))   
# 27

poYBAGQ6YauAOvE2AADP1qMuLjw462.jpg

如上所示,命名分组的关键语法是 ?P。它定义了对应组的名称,我们可以使用 group() 函数根据名称提取内容。

使用VERBOSE标志使正则表达式易读

在一些复杂的情况下,正则表达式可能会变得越来越复杂和难以读取。我们肯定需要一种方法来使其更整洁和干净。 这就是re.VERBOSE技巧。


import re


text = "linuxmi, linuxmi@linuxmi.com, 666-666-6666"
pattern = r"""
    (?Pw+),s
    (?Pw+@w+.w+),s
    (?Pd{3}-d{3}-d{4})
"""


match = re.search(pattern, text, re.VERBOSE)
if match:
    print(match.group("name"))
    print(match.group("email"))
    print(match.group("phone"))
# linuxmi
# linuxmi@linuxmi.com
# 666-666-6666
如上所示,我们可以将复杂的正则表达式分成多行,以提高可读性。只要在re.search()函数中加入re.VERBOSE标志,它就可以像平常一样被正确识别。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    570

    浏览量

    20464
  • 过滤器
    +关注

    关注

    1

    文章

    427

    浏览量

    19509
  • python
    +关注

    关注

    55

    文章

    4766

    浏览量

    84364

原文标题:Python 中使用正则表达式的正确姿势

文章出处:【微信号:Linux迷,微信公众号:Linux迷】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是正则表达式正则表达式如何工作?哪些语法规则适用正则表达式

    正则表达式又称规则表达式(Regular Expression,代码中常简写为 regex、regexp 或 RE),是种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配
    的头像 发表于 11-03 14:41 2705次阅读
    什么是<b class='flag-5'>正则表达式</b>?<b class='flag-5'>正则表达式</b>如何工作?哪些<b class='flag-5'>语法</b>规则适用<b class='flag-5'>正则表达式</b>?

    shell正则表达式学习

    正则表达式计算机科学中,是指个用来描述或者匹配系列符合某个句法规则的字符串的单个字符串。很多文本编辑器或其他工具里,
    发表于 07-25 17:18

    总结linux脚本语法正则表达式的应用

    每日学点之linux脚本语法以及正则表达式基础
    发表于 11-08 09:23

    初识 Python 正则表达式

    正则表达式个特殊的字符序列,用于判断个字符串是否与我们所设定的字符序列是否匹配,也就是说检查个字符串是否与某种模式匹配。Python
    发表于 03-17 16:44

    深入浅出boost正则表达式

    什么是正则表达式正则表达式种用来描述定数量文本的模式。Regex代表Regular Express. 如果您不知道什么是正则表达式
    发表于 09-08 18:09 9次下载

    快速入门IPv6和正则表达式

    对于日常开发中只接触IPv4,并没有深入研究过正则表达式的开发者,面对IPv6和正则表达式,容易产生畏惧心理,觉得是两座难以翻越的大山。本文通过一些表格整理对IPv6的表示方法,以及正则表达式
    的头像 发表于 03-30 09:31 8885次阅读
    快速入门IPv6和<b class='flag-5'>正则表达式</b>

    Python正则表达式教程之标准库的完整介绍及使用示例说明

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写
    发表于 01-23 16:00 3次下载
    <b class='flag-5'>Python</b><b class='flag-5'>正则表达式</b>教程之标准库的完整介绍及使用示例说明

    Python正则表达式的学习指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写
    发表于 09-15 08:00 0次下载
    <b class='flag-5'>Python</b><b class='flag-5'>正则表达式</b>的学习指南

    Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写
    发表于 03-26 09:13 10次下载
    <b class='flag-5'>Python</b><b class='flag-5'>正则表达式</b>指南

    初识 Python 正则表达式

    正则表达式个特殊的字符序列,用于判断个字符串是否与我们所设定的字符序列是否匹配,也就是说检查个字符串是否与某种模式匹配。 Python
    的头像 发表于 03-17 16:44 1394次阅读

    python正则表达式中的常用函数

    编译正则表达式模式,返回正则对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高
    的头像 发表于 03-18 16:12 1754次阅读

    Linux入门之正则表达式

    一些约定好的匹配规则,但由于规则较多,可能比较容易忘记。 本文会先整理出所有的正则表达式以及其含义,接下来会利用grep命令,详细介绍每种正则表达式的使用方式,并给出案例。
    的头像 发表于 05-12 15:31 821次阅读
    Linux入门之<b class='flag-5'>正则表达式</b>

    OpenHarmony中使正则表达式

    本文主要介绍笔者在做开源鸿蒙应用开发时,ArkTs 中使正则表达式处理像 string 等字符串对象。
    的头像 发表于 06-06 09:24 1276次阅读

    Python中的正则表达式

    类字符串的特征,这样我们就可以快速、高效地处理大量的文本数据。 基础语法 Python中,使用re模块来操作正则表达式。re模块提供了很多函数,用于对字符串进行
    的头像 发表于 06-21 16:52 944次阅读

    linux正则表达式匹配字符串

    Linux操作系统中,正则表达式种强大的模式匹配工具,它可以用于文本中查找、替换和筛选特定的字符串。准确掌握正则表达式
    的头像 发表于 11-23 10:26 675次阅读