如果说Java处理字符串是"手工裁缝",那Python就是"智能工厂流水线"。
同样是切一刀、缝一针,Python往往一行代码搞定,Java得写三五句。更别提那个让Java开发者眼红的 f-string ,简直就是字符串格式化的"外挂"。
今天我们就来领教一下Python字符串的"十八般武艺",顺便用
re模块给正则表达式加点Buff。
1. 字符串基础:引号自由,操作丝滑
Java的"规矩"
java
String s = "Hello"; // 双引号
char c = 'A'; // 单引号是字符
// 多行字符串?Java 13+ 才有文本块
String multi = """
Line1
Line2
""";
Python的"随性"
python
s1 = "Hello" # 双引号
s2 = 'Hello' # 单引号,没区别
s3 = """多行
字符串
随便写""" # 三引号,天生支持多行
Python里单双引号完全等价,可以嵌套使用避免转义:"It's ok" 或 'He said "Hi"'。
常用方法对比(Python vs Java)
| 操作 | Java | Python |
|---|---|---|
| 长度 | s.length() |
len(s) |
| 转大写 | s.toUpperCase() |
s.upper() |
| 转小写 | s.toLowerCase() |
s.lower() |
| 去除两端空格 | s.trim() |
s.strip() |
| 拆分 | s.split(",") |
s.split(",") |
| 拼接 | String.join(",", arr) |
",".join(arr) |
| 替换 | s.replace("old","new") |
s.replace("old","new") |
| 查找子串 | s.indexOf(sub) |
s.find(sub) |
| 是否包含 | s.contains(sub) |
sub in s |
注意 :Python的join是字符串的方法,参数是列表,写起来有点反直觉,但习惯后很优雅:
python
words = ["apple", "banana", "cherry"]
s = ", ".join(words) # "apple, banana, cherry"
2. 切片:截取字符串的"降维打击"
Java里截取字符串用s.substring(start, end),Python的切片语法 [start:end:step] 则强大得多。
python
s = "Hello, World!"
print(s[0:5]) # Hello
print(s[7:12]) # World
print(s[:5]) # Hello (省略开始)
print(s[7:]) # World! (省略结束)
print(s[::2]) # Hlo ol! (步长为2,每隔一个取一个)
print(s[::-1]) # !dlroW ,olleH (反转字符串,一步到位)
在Java里想反转字符串?得用StringBuilder(s).reverse().toString(),Python一个切片搞定。
3. 格式化输出:f-string,Python的"王炸"
Java的字符串格式化有好几种:String.format、MessageFormat、Formatter,都略显啰嗦。
java
String name = "Alice";
int age = 25;
String s = String.format("我叫%s,今年%d岁", name, age);
Python的 f-string (Python 3.6+)直接把变量嵌入字符串,前缀f,花括号里写表达式:
python
name = "Alice"
age = 25
s = f"我叫{name},今年{age}岁" # 直接解析变量
print(f"明年我{age+1}岁") # 花括号里甚至可以写计算
print(f"{name:>10}") # 右对齐,宽度10
print(f"{age:05d}") # 数字补零:00025
f-string不仅简洁,而且性能好,是Python最推荐的格式化方式。
4. 正则表达式:re模块,Java的Pattern/Matcher平替
Java的正则用起来有点重:
java
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("123abc456");
while (m.find()) {
System.out.println(m.group());
}
Python的re模块更轻量,常用函数一步到位:
python
import re
text = "我的电话是13812345678,邮箱是test@example.com"
# 查找所有数字
numbers = re.findall(r"\d+", text) # ['13812345678']
# 替换
new_text = re.sub(r"\d{11}", "***", text)
# 匹配验证
if re.match(r"^\d+$", "12345"):
print("全是数字")
# 迭代匹配
for m in re.finditer(r"\b\w+@\w+\.\w+\b", text):
print(m.group())
注意 :Python的正则字符串前面加r表示原始字符串,可以避免反斜杠转义地狱。Java里你得写"\\d+",Python写r"\d+",舒服多了。
5. 实战小练习:清洗用户评论
题目:从一段用户评论中提取所有中文单词(连续的中文字符),并统计每个词出现的次数(不区分大小写?中文没有大小写,直接统计)。同时移除所有的标点符号和数字。
文本示例:
用户A: 这个产品真不错,质量很好!推荐购买。
用户B: 一般般吧,价格有点高,不推荐。
期望输出:
这个:1
产品:1
真不错:1
质量:1
很好:1
推荐:1
购买:1
一般般:1
吧:1
价格:1
有点高:1
不推荐:1
参考代码(可直接运行)
python
import re
text = """
用户A: 这个产品真不错,质量很好!推荐购买。
用户B: 一般般吧,价格有点高,不推荐。
"""
# 提取所有中文字符串(连续的中文)
# 中文Unicode范围:\u4e00-\u9fff
chinese_words = re.findall(r'[\u4e00-\u9fff]+', text)
# 统计频率
freq = {}
for word in chinese_words:
freq[word] = freq.get(word, 0) + 1
# 输出
for word, count in freq.items():
print(f"{word}:{count}")
运行结果:
这个:1
产品:1
真不错:1
质量:1
很好:1
推荐:1
购买:1
一般般:1
吧:1
价格:1
有点高:1
不推荐:1
解释:
re.findall(r'[\u4e00-\u9fff]+', text):匹配连续的中文字符,返回列表。- 中文的Unicode范围是
\u4e00到\u9fff(基本汉字)。 - 然后使用字典统计频率,和Day 3的单词统计一样。
6. 小扩展:用f-string打印漂亮表格
python
data = [("Alice", 85), ("Bob", 92), ("Charlie", 78)]
print(f"{'Name':<10}{'Score':>5}")
print("-" * 15)
for name, score in data:
print(f"{name:<10}{score:>5}")
输出:
Name Score
---------------
Alice 85
Bob 92
Charlie 78
7. 结语
Python的字符串处理就像一把瑞士军刀:
- 切片:快刀斩乱麻
- f-string:贴心的智能助手
- re模块:精准的狙击镜
Java转过来后,你会发现以前需要写10行的字符串操作,现在2行搞定。效率提升肉眼可见。
今日挑战 :
写一个函数 extract_emails(text),用正则表达式提取出所有邮箱地址,并返回列表。邮箱格式假设为:用户名@域名.后缀(只考虑常见的.com、.cn等)。测试文本:"联系我:zhang@163.com 或 li@example.cn,谢谢"。
欢迎在评论区贴上你的代码!
下篇预告:Day 7 我们将进入 列表推导式与生成器,体验Python里"一行顶五行的快感"。
(本文代码基于Python 3.14,在VSCode中测试通过。如果觉得有帮助,点个赞再走~)