上一节我们聊了str.contains()
,它可以帮我们做模糊的“文本包含”搜索。但有时候,我们需要更精确的判断,比如,我只想找出所有以'EUR'
开头的货币对,而不想匹配到'GBPEUR'
。
这种要求“必须以…开头”的场景,就需要我们的主角——str.startswith()
函数登场了。
str.startswith()
的核心规则
它的用法和str.contains()
几乎一样:str.startswith(主字符串, 要查找的子字符串)
。它的返回规则也很相似,但判断标准更严格:
- 常规情况:只有当“主字符串”的开头部分与“子字符串”一模一样时,才返回
true
;否则返回false
。 - 最重要的规则:同样,严格区分大小写。
'EUR'
和'eur'
是两码事。 - 空值“陷阱”:和
str.contains()
一样,如果被查找的子字符串
是空的(""
或na
),函数会认为“任何字符串都以空字符串开头”,所以结果总是true
。 - 被搜索对象为空:如果你在一个空的主字符串里去查找一个非空的子字符串,结果肯定是
false
。
这个函数的应用场景非常明确,主要就是做“前缀匹配”。比如,筛选所有以特定字母开头的品种代码(如'BTC'
开头的比特币系列);识别用户输入的,以特定单词(如'BUY'
)开头的机器人指令;或者在做交易复盘时,筛选出所有以特定标识开头的订单备注等等。
严格区分大小写!
我要再次强调,无论是contains
, startswith
还是endswith
,它们在比较时,对字母的大小写都极度敏感。这是新手最常犯的错误,值得反复提醒。
下面这个表格能让你看得更清楚:
精确匹配“ES”期货合约
下面的指标会检查当前交易品种的代码(syminfo.ticker
)是否以“ES”开头。如果符合,那么这个交易品种很可能就是E-mini S&P 500期货合约。
这个例子能很好地说明为什么有时必须用str.startswith()
而不是str.contains()
。因为市场上还有Micro E-mini S&P 500期货,其代码是“MES”。如果我们用str.contains()
来查找“ES”,会把“MES”也错误地包含进来。而str.startswith()
则能精准地只匹配“ES”开头的品种。
//@version=6
indicator(title="str.startswith() 案例", overlay=true)
// 1. 检查当前品种代码,判断是否以"ES"开头
esInstrument = str.startswith(syminfo.ticker, "ES")
// 2. 用标签显示判断结果
if barstate.islastconfirmedhistory
// 创建一个新标签,显示品种代码和我们的判断结果
label.new(bar_index, high, color=color.black, textcolor=color.white,
text=syminfo.ticker + "\n\nDoes the symbol start with 'ES'?\n" +
str.tostring(esInstrument))
在图表上,这个脚本会绘制一个文本标签,显示当前交易品种的代码,并告知该代码是否以“ES”开头。(当你将图表切换到其他交易品种时,标签中显示的信息也会随之更新。)
总结
str.startswith()
是你工具箱里一把更精准的“文本手术刀”。当str.contains()
的模糊搜索无法满足你的要求,你需要严格地从字符串的开头进行匹配时,它就是你的不二之选。- 它是在Pine Script
v5
版本中才新增的功能。 - 使用时,牢记它和
str.contains()
共有的最重要特点:严格区分大小写。
评论前必须登录!
立即登录 注册