如何在Python中按顺序检测字符串子串(Blender插件开发场景)
解决Blender唇同步插件的音素顺序检测问题
核心问题在于你当前的代码是按固定顺序检查音素是否存在,而非按输入字符串的顺序逐个位置匹配音素,所以不管输入字符串的顺序如何,输出都是你写判断的固定顺序(a→b→c)。
单字符音素解决方案
如果你的音素都是单字符(比如示例中的a、b、c、d),直接遍历输入字符串的每个字符,检查是否属于目标音素集合即可,这样完全遵循输入顺序:
# 定义所有需要检测的单字符音素集合 target_phonemes = {"a", "b", "c", "d"} input_text = "bcda" # 可以替换为任意输入字符串 for char in input_text: if char in target_phonemes: print(f"*{char} detected, do something")
运行这段代码,输入bcda时输出顺序就是b→c→d→a,输入abcd时则是a→b→c→d,完全符合你的需求。
多字符音素进阶方案
实际英语音素包含大量多字符情况(比如aɪ、ʌv、tsə这类),这时候需要用最长匹配算法,优先匹配长度更长的音素,避免把复合音素拆分成单个字符:
# 定义所有音素,包含单字符和多字符 phonemes = ["aɪ", "lʌv", "piː", "tsə", "a", "b", "c", "d"] # 按音素长度降序排序,确保先尝试匹配最长的音素 sorted_phonemes = sorted(phonemes, key=lambda x: len(x), reverse=True) input_text = "aɪ lʌv ˈpiːtsə" current_index = 0 text_length = len(input_text) while current_index < text_length: matched = False # 遍历排序后的音素,尝试匹配当前位置的字符 for phoneme in sorted_phonemes: phoneme_len = len(phoneme) # 检查当前剩余字符长度是否足够匹配该音素 if current_index + phoneme_len <= text_length: substring = input_text[current_index:current_index+phoneme_len] if substring == phoneme: print(f"*{phoneme} detected, do something") current_index += phoneme_len matched = True break # 若未匹配到任何音素,跳过当前字符(比如空格、重音符号) if not matched: current_index += 1
这段代码会正确识别aɪ、lʌv这类复合音素,同时严格遵循输入字符串的顺序处理。
内容的提问来源于stack exchange,提问作者sxgbln
相关产品推荐
相关产品推荐

