Python 中的正则表达式


Python 中的正则表达式

每当你遇到文本处理问题时,正则表达式(regex)不可或缺(在算法题目中也会出现)。

# 验证电子邮件地址

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。

# 从字符串中提取数字

要从长文本中找到一些特殊字符,最直接的想法是使用 for 循环遍历所有字符并找到所需的内容。

但是,没有必要使用任何循环。正则表达式就是为了作为过滤器而生的。(时间复杂度更低,更快!!)

import re

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

print(extract_numbers("先将键盘1上的三4行字母5进行6打表100000000。"))
# ['1456100000000']

re.findall () 函数接收一个正则表达式和一个文本,可以方便地帮助我们找到所有我们需要的字符。

其中 \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

# 将文本分割成单词

将长文本分割成单独的单词是日常编程中的另一个常见需求。借助 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']

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

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.

文章作者: liuli
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuli !
评论
评论
  目录