在 Python 中使用正则表达式的 9 个实例
每当你遇到文本处理问题时,正则表达式(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="[email protected]")
# 合法的邮件地址:)
val_email(email="elonexample.com")
# 无效的邮件地址!!
val_email(email="[email protected]")
# 无效的邮件地址!!
在这个例子中,我们使用 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 次。这就是为什么 “[email protected]” 被识别为无效的电子邮件地址。
-
- 表示匹配前面的正则表达式至少 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']
如上所示,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.
如上所示,我们只需要将三个参数传递给sub()函数:模式、替换字符串和原始文本。它将在执行后返回新文本。
-
在Python中预编译正则表达式
在Python中使用正则表达式匹配字符串时,有两个步骤:
编译正则表达式。 使用编译后的正则表达式匹配字符串。 因此,如果一个正则表达式被重复使用,每次编译都会浪费时间。
为了避免这种情况,Python允许我们预先编译一个正则表达式,然后重复使用编译后的对象进行后续匹配。这可以显著提高性能和效率。
import re
re_numbers = re.compile(r'^/d+$')
print(re_numbers.match('123'))
# <re.Match object; span=(0, 3), 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'
如上所示,group(0) 返回原始字符串。然后,group(1) 和 group(2) 分别返回匹配字符串的第一部分和第二部分。
-
用于提取子内容的命名分组
如果子组数量变得很多,由于太多的神奇数字,程序将很难阅读。
因此,Python 提供了用于子内容提取的命名组技巧:我们可以使用命名组捕获匹配字符串的特定部分,而不是使用编号的捕获组。这可以使我们的代码更易于阅读和维护。
以下是一个例子:
import re
text = "linuxmi, age 27"
pattern = r"(?P<name>/w+),/sage/s(?P<age>/d+)"
match = re.search(pattern, text)
print(match.group("name"))
# linuxmi
print(match.group("age"))
# 27
如上所示,命名分组的关键语法是 ?P<xxx>。它定义了对应组的名称,我们可以使用 group() 函数根据名称提取内容。
- 使用VERBOSE标志使正则表达式易读
在一些复杂的情况下,正则表达式可能会变得越来越复杂和难以读取。我们肯定需要一种方法来使其更整洁和干净。
这就是re.VERBOSE技巧。
import re
text = "linuxmi, [email protected], 666-666-6666"
pattern = r"""
(?P<name>/w+),/s
(?P<email>/w+@/w+/./w+),/s
(?P<phone>/d{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
# [email protected]
# 666-666-6666
如上所示,我们可以将复杂的正则表达式分成多行,以提高可读性。只要在re.search()函数中加入re.VERBOSE标志,它就可以像平常一样被正确识别。
OK,这就是本文的内容。如果还有什么疑问,请在下面的评论区告诉我们。
The post 在 Python 中使用正则表达式的 9 个实例 first appeared on Linux迷.
共有 0 条评论