Python 字符串分割
源字符串
lyric = r"[ti:让你感觉我的心再说爱你][ar:彭家丽][al:新曲+精选][offset:0][00:01.51]让你感觉我的心再说爱你 - 彭家丽[00:23.90]不愿说别离 我紧紧拥着你[00:28.57][00:29.57]让你听见我的心 在偷偷的叹息[00:35.50][00:36.19]过去所有的回忆 我会放在我心里[00:41.80][00:42.68]我会永远为你而美丽[00:48.35][00:49.23]不愿道别离 我紧紧吻着你[00:54.59][00:55.47]吻**的忧郁 你的泪滴[01:01.52]在每个深沉夜里 每一个梦里[01:07.95]我会用我的真心好好爱你"
要求
[ti:让你感觉我的心再说爱你]
[ar:彭家丽][al:新曲+精选]
[offset:0]
[00:01.51]让你感觉我的心再说爱你 - 彭家丽
[00:23.90]不愿说别离 我紧紧拥着你
[00:28.57][00:29.57]让你听见我的心 在偷偷的叹息
[00:35.50][00:36.19]过去所有的回忆 我会放在我心里
[00:41.80][00:42.68]我会永远为你而美丽
[00:48.35][00:49.23]不愿道别离 我紧紧吻着你
[00:54.59][00:55.47]吻**的忧郁 你的泪滴
[01:01.52]在每个深沉夜里 每一个梦里
[01:07.95]我会用我的真心好好爱
分析,思路
可直接处理
[ti:xxxxx] 和 [offset:0] 单独一行
不可直接处理
[ar:xxxx] [al:xxxx] [00:00.00] 需要和其它的元素包含在一行
处理 ar 和 al
采用正则去匹配它
pattern1 = re.compile("(\[a[rl]:.*?\])")
[ar:xxxx] [al:xxxx] 相邻 ,只需要判断下一个元素不符合正则表达式就排除。
处理 [00:00.00] ***
有两种情况
正则表达式
pattern = re.compile("(\[\d+:\d+\.\d+\])")
[00:00.00] 后面跟字符串 或者 相同格式,然后再跟字符串
找【包含内容】
它们都是被 【 】 保函, 只需要定位 "[" "]" 的位置,就可以找到被包含的内容
<!--如果出现多级嵌套"[" "]",那就难了-->
使用 s.find 找到就返回坐标,没有返回 -1
执行思路
从头开始查找 "[" 再找 "]" 分别保留字符所在位置,然后截取中间内容:
temp_str 保存字符串 它是累加的
if lyric.find("[", start, lyric_len) != -1:
start = lyric.find("[", start, lyric_len)
end = lyric.find("]", start, lyric_len)
temp_str += lyric[start : end+1]
在与 2 个 正则匹配:
pattern.search(temp_str) 匹配 [00:00.00]
pattern1.search(temp_str, re_flag, len(temp_str) 匹配 [ar:xxxx] [al:xxxx] ,它是从 第一次匹配到的长度开始匹配下一次的结果:
比如:
第一次为 字符串为 temp_str = [ar:彭家丽], re_flag = len(temp_str )
第二次 temp_str += [al:新曲+精选]
<!-- temp_str = [ar:彭家丽][al:新曲+精选] -->
它只会匹配 [al:新曲+精选] 第二次结果,第一次跳过
if pattern.search(temp_str) or pattern1.search(temp_str, re_flag, len(temp_str)):
匹配:
再找 "]" 后面是否紧跟着 "["
if (lyric[end+1]) == "[":
是(出现这种情况 [ar:xxxx] [al:xxxx] [00:00.00]):
还需要匹配下一个 "[]" 里面的内容,将 start 移动到 "]" 的位置,开始累加,继续执行
re_flag = len(temp_str)
start = end
continue
不是( [00:00.00] 字符串):
[00:36.19]过去所有的回忆 我会放在我心里[00:41.80]
找出字符串的位置。被 "] [" 包含
把字符串储存起来, re_flag 复位
end_start = lyric.find("[", end, lyric_len)
temp_str += lyric[end+1:end_start]
re_flag = 0
检查过多匹配
[ar:彭家丽][al:新曲+精选][offset:0]
[offset:0] 过多匹配 需要回退到这个字符串开始
如果匹配标记为0 没有出现过多匹配不需要回退
if re_flag != 0:
temp_str = temp_str[0:re_flag]
end = start # 回退
清空信息
result.append(temp_str)
temp_str = ""
start = end
re_flag = 0
不匹配直接退出循环。
完成代码
import re
pattern = re.compile("(\[\d+:\d+\.\d+\])")
pattern1 = re.compile("(\[a[rl]:.*?\])")
re_flag = 0;
lyric = r"[ti:让你感觉我的心再说爱你][ar:彭家丽][al:新曲+精选][offset:0][00:01.51]让你感觉我的心再说爱你 - 彭家丽[00:23.90]不愿说别离 我紧紧拥着你[00:28.57][00:29.57]让你听见我的心 在偷偷的叹息[00:35.50][00:36.19]过去所有的回忆 我会放在我心里[00:41.80][00:42.68]我会永远为你而美丽[00:48.35][00:49.23]不愿道别离 我紧紧吻着你[00:54.59][00:55.47]吻**的忧郁 你的泪滴[01:01.52]在每个深沉夜里 每一个梦里[01:07.95]我会用我的真心好好爱你"
lyric_len = len(lyric)
result = []
start = 0 # [
end = 0 # ]
temp_str = ""
end_start = 0
while True:
if lyric.find("[", start, lyric_len) != -1:
start = lyric.find("[", start, lyric_len)
end = lyric.find("]", start, lyric_len)
temp_str += lyric[start : end+1]
if pattern.search(temp_str) or pattern1.search(temp_str, re_flag, len(temp_str)):
if (lyric[end+1]) == "[":
re_flag = len(temp_str)
start = end
continue
else:
end_start = lyric.find("[", end, lyric_len)
temp_str += lyric[end+1:end_start]
re_flag = 0
if re_flag != 0:
temp_str = temp_str[0:re_flag]
end = start # 回退
result.append(temp_str)
temp_str = ""
start = end
re_flag = 0
else: break
print("="*50)
for n in result:
print(f"{n}")