Python字符串操作:从基础到正则入门
字符串是编程中最常用的数据类型之一,本篇将系统学习Python字符串的各种操作方法,并初步了解正则表达式。
一、字符串基础
1. 创建字符串
python
# 单引号
s1 = 'Hello World'
# 双引号
s2 = "Hello World"
# 三引号(多行字符串)
s3 = """这是一个
多行字符串
可以换行"""
# 转义字符
print("Hello\nWorld") # \n 换行
print("Hello\tWorld") # \t 制表符
print("他说:\"你好\"") # \" 引号转义
print("C:\\Users\\name") # \\ 反斜杠
# 原始字符串(不转义,常用于路径和正则)
path = r"C:\Users\name\file.txt"
print(path)
2. 字符串拼接与重复
python
# + 拼接
greeting = "Hello" + " " + "World"
print(greeting) # Hello World
# * 重复
print("哈" * 3) # 哈哈哈
# join拼接(高效,推荐用于大量字符串拼接)
words = ["Hello", "World", "Python"]
result = " ".join(words)
print(result) # Hello World Python
result = "-".join(words)
print(result) # Hello-World-Python
⚠️ 大量字符串拼接不要用
+,因为字符串不可变,每次+都会创建新对象,效率低。用join更高效。
二、字符串索引与切片
1. 索引
python
s = "Python"
# 正向索引:0,1,2,3,4,5
print(s[0]) # P
print(s[5]) # n
# 负向索引:-1是最后一个
print(s[-1]) # n
print(s[-6]) # P
2. 切片
语法:字符串[起始:结束:步长]
python
s = "Hello World"
print(s[0:5]) # Hello(不包含结束索引)
print(s[:5]) # Hello(省略起始默认0)
print(s[6:]) # World(省略结束到末尾)
print(s[::2]) # HloWrd(步长2)
print(s[::-1]) # dlroW olleH(反转)
print(s[-5:]) # World(从倒数第5个到末尾)
三、常用字符串方法
1. 大小写转换
python
s = "Hello World"
print(s.upper()) # HELLO WORLD(全大写)
print(s.lower()) # hello world(全小写)
print(s.capitalize()) # Hello world(首字母大写)
print(s.title()) # Hello World(每个单词首字母大写)
print(s.swapcase()) # hELLO wORLD(大小写互换)
2. 查找与替换
python
s = "Hello World, Hello Python"
# find:查找子串,返回索引,找不到返回-1
print(s.find("World")) # 6
print(s.find("Java")) # -1
# rfind:从右边查找
print(s.rfind("Hello")) # 13
# index:查找,找不到会报错(区别于find)
print(s.index("World")) # 6
# count:统计出现次数
print(s.count("Hello")) # 2
# replace:替换
print(s.replace("Hello", "Hi")) # Hi World, Hi Python
print(s.replace("Hello", "Hi", 1)) # 只替换第一个
3. 判断方法
python
s = "Hello123"
print(s.startswith("Hello")) # True(以...开头)
print(s.endswith("123")) # True(以...结尾)
print(s.isalpha()) # False(是否全是字母)
print(s.isdigit()) # False(是否全是数字)
print(s.isalnum()) # True(是否全是字母和数字)
print(s.isupper()) # False(是否全大写)
print(s.islower()) # False(是否全小写)
print(" ".isspace()) # True(是否全是空白字符)
4. 去除空白
python
s = " Hello World "
print(s.strip()) # "Hello World"(去除两端空白)
print(s.lstrip()) # "Hello World "(去除左端空白)
print(s.rstrip()) # " Hello World"(去除右端空白)
# 去除指定字符
s2 = "###Hello###"
print(s2.strip("#")) # Hello
5. 分割与合并
python
s = "apple,banana,orange"
# split:按分隔符分割成列表
fruits = s.split(",")
print(fruits) # ['apple', 'banana', 'orange']
# 按行分割
text = "line1\nline2\nline3"
print(text.splitlines()) # ['line1', 'line2', 'line3']
# partition:分割成三部分(分隔符前、分隔符、分隔符后)
print(s.partition(",")) # ('apple', ',', 'banana,orange')
6. 对齐与填充
python
s = "Hello"
print(s.center(20, "-")) # -------Hello--------(居中)
print(s.ljust(20, "-")) # Hello---------------(左对齐)
print(s.rjust(20, "-")) # ---------------Hello(右对齐)
print(s.zfill(10)) # 00000Hello(左侧补零)
四、字符串格式化
1. f-string(推荐,Python 3.6+)
python
name = "小明"
age = 18
height = 1.756
# 基本用法
print(f"我叫{name},今年{age}岁")
# 表达式
print(f"明年我{age + 1}岁")
# 格式控制
print(f"身高: {height:.2f}米") # 保留2位小数: 1.76
print(f"年龄: {age:03d}") # 补零到3位: 018
print(f"百分比: {0.85:.1%}") # 百分比: 85.0%
print(f"金额: {12345:,}") # 千分位: 12,345
# 对齐
print(f"{'姓名':<10}{'年龄':>5}")
print(f"{name:<10}{age:>5}")
2. format方法
python
print("我叫{},今年{}岁".format("小明", 18))
print("我叫{0},今年{1}岁,{0}喜欢Python".format("小明", 18))
print("我叫{name},今年{age}岁".format(name="小明", age=18))
3. %格式化(老式,了解即可)
python
print("我叫%s,今年%d岁,身高%.2f米" % ("小明", 18, 1.75))
五、正则表达式入门
正则表达式(Regex)是一种强大的字符串匹配工具,用于复杂的查找、替换、验证。
1. re模块基础
python
import re
# 基本匹配
text = "我的电话是13812345678,邮箱是test@example.com"
# search:查找第一个匹配
match = re.search(r"\d{11}", text)
if match:
print("找到手机号:", match.group()) # 13812345678
# findall:查找所有匹配
emails = re.findall(r"\w+@\w+\.\w+", text)
print(emails) # ['test@example.com']
2. 常用正则符号
| 符号 | 含义 | 示例 |
|---------|------------|---------------------------|-------|-----------------|
| . | 任意字符(除换行) | a.c 匹配 abc, a1c |
| * | 前一个字符0次或多次 | ab*c 匹配 ac, abc, abbc |
| + | 前一个字符1次或多次 | ab+c 匹配 abc, abbc |
| ? | 前一个字符0次或1次 | ab?c 匹配 ac, abc |
| {n} | 前一个字符恰好n次 | a{3} 匹配 aaa |
| {n,m} | 前一个字符n到m次 | a{2,4} 匹配 aa, aaa, aaaa |
| \d | 数字 | \d+ 匹配数字串 |
| \w | 字母数字下划线 | \w+ 匹配单词 |
| \s | 空白字符 | \s+ 匹配空格 |
| ^ | 字符串开头 | ^Hello |
| $ | 字符串结尾 | World$ |
| [] | 字符集 | [abc] 匹配a或b或c |
| [^] | 排除字符集 | [^0-9] 非数字 |
| ` | ` | 或 | `cat | dog` 匹配cat或dog |
| () | 分组 | (ab)+ 匹配ab重复 |
3. 常用正则示例
python
import re
# 验证手机号
def is_phone(text):
return bool(re.match(r"^1[3-9]\d{9}$", text))
print(is_phone("13812345678")) # True
print(is_phone("12345678901")) # False
# 验证邮箱
def is_email(text):
return bool(re.match(r"^[\w.-]+@[\w.-]+\.\w+$", text))
print(is_email("test@example.com")) # True
# 提取所有数字
text = "订单号123,金额456元,数量789个"
nums = re.findall(r"\d+", text)
print(nums) # ['123', '456', '789']
# 替换
text = "我的电话是13812345678"
result = re.sub(r"\d{11}", "***", text)
print(result) # 我的电话是***
# 分割
text = "a,b;c d"
result = re.split(r"[,; ]", text)
print(result) # ['a', 'b', 'c', 'd']
六、实战:用户输入验证器
python
import re
def validate_username(username):
"""验证用户名:4-16位字母数字下划线"""
if re.match(r"^\w{4,16}$", username):
return True, "用户名合法"
return False, "用户名需4-16位字母、数字或下划线"
def validate_phone(phone):
"""验证手机号"""
if re.match(r"^1[3-9]\d{9}$", phone):
return True, "手机号合法"
return False, "请输入正确的11位手机号"
def validate_email(email):
"""验证邮箱"""
if re.match(r"^[\w.-]+@[\w.-]+\.\w+$", email):
return True, "邮箱合法"
return False, "邮箱格式不正确"
def validate_password(password):
"""验证密码:8-20位,必须包含字母和数字"""
if len(password) < 8 or len(password) > 20:
return False, "密码长度需8-20位"
if not re.search(r"[a-zA-Z]", password):
return False, "密码必须包含字母"
if not re.search(r"\d", password):
return False, "密码必须包含数字"
return True, "密码合法"
# 测试
tests = [
("username", "小明_123", validate_username),
("phone", "13812345678", validate_phone),
("email", "test@example.com", validate_email),
("password", "abc12345", validate_password),
]
for name, value, func in tests:
valid, msg = func(value)
print(f"{name}: {msg}")
七、常见坑点
-
字符串不可变:所有字符串方法都返回新字符串,原字符串不变
pythons = "hello" s.upper() print(s) # hello(没变!需要赋值:s = s.upper()) -
split的空字符串 :
"".split(",")返回['']而不是[] -
正则中的反斜杠 :正则里的
\d在普通字符串中要写成\\d,建议用原始字符串r"\d" -
中文处理 :
\w在Python3中也匹配中文字符,如果只想匹配英文用[a-zA-Z0-9_]
八、课后练习
- 编写程序,统计字符串中每个字符出现的次数
- 编写程序,将"hello world"转换为"Hello World"(每个单词首字母大写)
- 编写程序,从一段文本中提取所有的URL链接
- 编写程序,验证身份证号(18位,最后一位可以是X)
九、小结
本篇学习了字符串的索引切片、常用方法、格式化三种方式以及正则表达式入门。字符串处理是日常编程中最常见的任务,熟练掌握这些方法能大幅提高效率。
📌 下一篇预告:《Python列表与元组:有序序列的完整指南》
本专栏持续更新中,欢迎点赞、收藏、关注三连支持!🐍