吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1614|回复: 1
收起左侧

[Python 转载] python 字符串处理,歌词处理

[复制链接]
Cool_Breeze 发表于 2021-4-3 14:36

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}")

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

mettle 发表于 2021-4-3 21:42
学习学习不错不错!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表