Python字符串操作:从基础到正则入门

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}")

七、常见坑点

  1. 字符串不可变:所有字符串方法都返回新字符串,原字符串不变

    python 复制代码
    s = "hello"
    s.upper()
    print(s)  # hello(没变!需要赋值:s = s.upper())
  2. split的空字符串"".split(",") 返回 [''] 而不是 []

  3. 正则中的反斜杠 :正则里的 \d 在普通字符串中要写成 \\d,建议用原始字符串 r"\d"

  4. 中文处理\w 在Python3中也匹配中文字符,如果只想匹配英文用 [a-zA-Z0-9_]

八、课后练习

  1. 编写程序,统计字符串中每个字符出现的次数
  2. 编写程序,将"hello world"转换为"Hello World"(每个单词首字母大写)
  3. 编写程序,从一段文本中提取所有的URL链接
  4. 编写程序,验证身份证号(18位,最后一位可以是X)

九、小结

本篇学习了字符串的索引切片、常用方法、格式化三种方式以及正则表达式入门。字符串处理是日常编程中最常见的任务,熟练掌握这些方法能大幅提高效率。

📌 下一篇预告:《Python列表与元组:有序序列的完整指南》


本专栏持续更新中,欢迎点赞、收藏、关注三连支持!🐍

相关推荐
自进化Agent智能体1 小时前
Hermes 子代理委派 —— 并行工作的艺术
后端
步行cgn1 小时前
MyBatis 动态 SQL 中的 <foreach> 标签完全解析
后端
SomeB1oody2 小时前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程
唐青枫3 小时前
别只把 enum 当常量列表:Zig 枚举、状态机与 Tagged Union 实战
后端
2601_963870213 小时前
【计算机毕业设计】基于Spring Boot的非遗文创产品交易平台的设计与实现
java·spring boot·后端
lv__pf3 小时前
Spring之AOP底层源码解析(下)【TL spring14】
java·后端·spring
苍何3 小时前
保姆级教程,Codex 接入 DeepSeek V4 Pro 和 Grok 4.6,6 种方法全整理
后端
苍何3 小时前
全球首款原生全模态交互式世界模型来了,AI 视频终于能“玩”了
后端