【Day 6 Java转Python】字符串处理的“降维打击”

如果说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.formatMessageFormatFormatter,都略显啰嗦。

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中测试通过。如果觉得有帮助,点个赞再走~)

相关推荐
2301_764441332 小时前
家国同构模型:计算社会学的创新探索
python·数学建模
EFCY1MJ902 小时前
MYSQL ID耗尽应急恢复方案
java·数据库·mysql
hogenlaw2 小时前
Stream流
android·java·开发语言
ShCDNay2 小时前
Python核心底层知识(个人记录)
开发语言·python
xyq20242 小时前
组合实体模式
开发语言
来自远方的老作者2 小时前
第7章 运算符-7.2 赋值运算符
开发语言·数据结构·python·赋值运算符
A.A呐2 小时前
【C++第二十四章】异常
开发语言·c++
常利兵3 小时前
解锁Kotlin:数据类与密封类的奇妙之旅
android·开发语言·kotlin
来自远方的老作者3 小时前
第7章 运算符-7.1 算术运算符
开发语言·数据结构·python·算法·算术运算符