跳至主要內容

11. 字符串操作与正则表达式

小白debug大约 5 分钟

11. 字符串操作与正则表达式

在这一节里,我们要探讨一下在 Python 中如何处理文字,也就是字符串(String)操作以及使用正则表达式(Regular Expression)。

从头说起:什么是字符串?

在编程中,我们经常需要处理文本信息,比如存储用户的名字、打印一段话等等。这些文本信息实际上是由字符组成的,而 Python 中用一对单引号或双引号括起来的内容就是一个字符串。

举个例子:

name = "Alice"
message = 'Hello, how are you?'

这里,namemessage 就是字符串变量,分别存储了名字和问候语。

字符串的基本操作

1. 字符串拼接

我们可以使用 + 来将两个字符串连接起来:

greeting = "Hello"
name = "Alice"
message = greeting + ", " + name

这样,message 就会变成 "Hello, Alice"

2. 字符串长度

你可以用 len() 函数来获取字符串的长度:

message = "Hello, how are you?"
length = len(message)

这里 length 就会得到 18,因为这句话有 18 个字符。

3. 字符串索引

每个字符都有一个索引,表示它在字符串中的位置。注意,Python 中索引是从 0 开始的。

message = "Hello, how are you?"
first_char = message[0]  # 获取第一个字符,结果是 'H'

4. 子字符串

你可以使用切片来获取字符串的一部分:

message = "Hello, how are you?"
substring = message[7:10]  # 获取从第7个到第9个字符,结果是 'how'

5. 替换子串

如果你想把字符串中的某一部分替换成其他内容,可以使用 replace() 方法:

message = "Hello, how are you?"
new_message = message.replace("Hello", "Hi")

这样,new_message 就会成为 "Hi, how are you?"

6. 分割与连接

你可以使用 split() 方法将一个字符串拆分成多个部分:

sentence = "Hello, how are you?"
words = sentence.split(", ")  # 用逗号和空格分割字符串

words 就会成为一个列表 ["Hello", "how are you?"]

相反,你也可以使用 join() 方法将多个字符串连接成一个:

words = ["Hello", "how are you?"]
sentence = ", ".join(words)  # 用逗号和空格连接字符串列表

sentence 就会成为 "Hello, how are you?"

正则表达式:强大的模式匹配工具

正则表达式是一种强大的模式匹配工具,可以用来寻找、匹配和替换文本中的特定模式。

常用正则表达式元字符

以下是一些常用的正则表达式元字符及其含义:

  • *:匹配前一个字符(或表达式)0 次或多次。
  • .:匹配任意单个字符,除了换行符 \n
  • ?:匹配前一个字符(或表达式)0 次或 1 次,即可选。
  • \d:匹配任意一个数字(0-9)。
  • \w:匹配字母、数字、下划线,等同于 [a-zA-Z0-9_]
  • ^:以某字符开头。
  • $:以某字符结尾。
  • []:表示一个字符集合,匹配其中任意一个字符。
  • |:或,匹配两者中的任意一个。
  • ():用于分组表达式。
  • {}:大括号用来指定一个模式的重复次数。具体来说:
    • {n} 表示前面的模式恰好重复 n 次。比如:a{3} 匹配连续出现 3 次的字母 "a",例如 "aaa"。
    • {n,} 表示前面的模式至少重复 n 次,可以是更多。比如:[A-Za-z]{5,} 匹配包含至少 5 个连续字母的字符串。
    • {n,m} 表示前面的模式重复次数介于 n 到 m 之间(包括 n 和 m)。比如:\d{2,4} 匹配包含 2 到 4 个连续数字的字符串,例如 "123" 或 "4567"。

示例:匹配中国三大运营商的手机号码

import re

pattern = r"(^1(3[4-9]|4[7]|5[0-27-9]|8[2-478]|9[8-9])\d{8}$)"
phone_numbers = ["13912345678", "18888888888", "13345678901", "17777777777", "16666666666"]

for number in phone_numbers:
    if re.match(pattern, number):
        print(f"{number} 是有效的手机号码")
    else:
        print(f"{number} 不是有效的手机号码")

上述代码中,我们使用了正则表达式 (^1(3[4-9]|4[7]|5[0-27-9]|8[2-478]|9[8-9])\d{8}$) 来匹配中国三大运营商的手机号码。

  • ^1:表示手机号码开头为数字 1。
  • (3[4-9]|4[7]|5[0-27-9]|8[2-478]|9[8-9]):匹配第二位数字,涵盖了所有符合条件的开头数字。
  • \d{8}:匹配后面的 8 个数字。
  • $:表示手机号码的结束。

这个正则表达式可以有效匹配以数字 1 开头,符合中国三大运营商规定的手机号码格式。

总结

通过这篇文章,我们学习了字符串的常用操作方法以及如何利用正则表达式进行模式匹配。我们还编写了一个匹配中国三大运营商手机号码的实例,巩固了所学知识。

希望你现在对字符串操作和正则表达式有了更清晰的理解。继续加油,你已经迈出了成为 Python 大师的重要一步!

实战:提取电子邮件地址

让我们通过一个实战来巩固所学知识。假设我们有一个文本,里面包含了一些电子邮件地址,我们想要将它们提取出来。

import re

text = "Contact us at [email protected] or [email protected] for assistance."

# 定义匹配电子邮件的正则表达式
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'

emails = re.findall(pattern, text)

print(emails)

这段代码中,我们使用了正则表达式 pattern 来匹配电子邮件地址,然后用 re.findall() 方法找到了所有匹配的结果。运行这段代码,你将会得到一个包含了所有匹配的电子邮件地址的列表。

小结

通过这篇文章,我们学习了如何在 Python 中进行字符串操作,包括拼接、获取长度、索引、切片、替换、分割与连接等方法。此外,我们还了解了正则表达式的基本概念,并通过实战演示了如何使用正则表达式来提取电子邮件地址。

希望你现在对字符串操作和正则表达式有了更清晰的认识。继续加油,你已经迈出了成为 Python 大师的一大步!

训练营看视频