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.