普贤教程 › 基础教程
字符串
PuXian 的字符串是 UTF-8 文本,索引与长度都按字符(而不是字节)计算。这一点处理中文时特别重要。
字面量与转义
px
var a = "双引号字符串" var b = '单引号也可以' print(a) print(b) print("换行\n制表\t结束")
text
双引号字符串 单引号也可以 换行 制表 结束
常用转义:\n 换行、\t 制表、\" 引号、\\ 反斜杠。字符串里出现 \ 时注意它是转义起点。
长度与索引
px
var s = "普贤abc" print(str(len(s))) print(s[0:1]) print(s[2:3]) print(s[2:5])
text
5
普
a
abclen() 数的是字符数(5),不是字节数(8)。切片是左闭右开:s[2:5] 取第 2、3、4 个字符。
切片技巧
px
var s = "abcdef" print(s[0:3]) print(s[3:]) print(s[-2:]) print(s[0:len(s) - 1])
text
abc
def
ef
abcde查找
px
var s = "hello world" print(str(s.find("world"))) print(str(s.find("zzz"))) print(str(contains(s, "lo w")))
text
6 -1 true
find 返回首次出现的下标,找不到返回 -1;只要判断"有没有"用 contains 更直接。
拆分与拼接
px
var line = "2026-11-05,晨曦,QA" var cols = split(line, ",") print(str(len(cols))) print(cols[0]) print(join(" | ", cols))
text
3 2026-11-05 2026-11-05 | 晨曦 | QA
join 的参数顺序是
join(分隔符, 列表),不是别的语言那种 list.join(sep)。写反了会得到「join 分隔符需要 string」。拆分多行文本:
px
var text = "第一行\n第二行\n第三行" var lines = split(text, "\n") print(str(len(lines))) for l in lines: print("· " + l)
text
3
· 第一行
· 第二行
· 第三行大小写与空白
px
var s = " Hello PuXian " print("[" + trim(s) + "]") print(to_upper(s)) print(to_lower(s))
text
[Hello PuXian] HELLO PUXIAN hello puxian
没有 upper / lower函数名是
to_upper / to_lower。trim 只去首尾空白,中间的空白保留。替换
px
var tpl = "你好,{name}!今天 {name} 值班。" print(replace(tpl, "{name}", "晨曦"))
text
你好,晨曦!今天 晨曦 值班。
replace 替换全部出现位置。要做"只替换第一次",先用 find 定位再手工拼接。
重复与拼接
px
print("ab" * 3) print("-" * 20) var parts = ["a", "b", "c"] var s = "" for p in parts: s += p print(s)
text
ababab -------------------- abc
循环里拼字符串字符串每次
+= 都是一次复制。几百次没问题;拼接上万段时先 append 到列表再 join,差别是几十毫秒和几秒的差别。逐字符处理
px
def reverse(s): var out = "" var i = len(s) - 1 while i >= 0: out += s[i:i + 1] i -= 1 return out print(reverse("普贤语言"))
text
言语贤普
常见错误
| 写法 | 结果 |
|---|---|
"x" + 1 | R1002 无法相加: string + int |
join(["a","b"], "-") | R1002 join 分隔符需要 string |
s[10:12](越界) | 返回空串,不报错 |
int("abc") | R1002 无法将 'abc' 转为 int |
大小写只对 ASCII 生效
to_upper / to_lower 是 ASCII-only
to_upper("äöü abc") 得到 äöü ABC——非 ASCII 字母原样不动。Go 的 strings.ToUpper 会给出 ÄÖÜ ABC。registry/strcase 包也只做 ASCII,需要 Unicode 大小写时得自己建映射表。px
print(to_upper("äöü abc")) # äöü ABC print(to_lower("ÄÖÜ ABC")) # ÄÖÜ abc
同理,len(s) 返回的是字符数不是字节数(len("中文") = 2);要字节数用 bytes_len(bytes(s))。