Cool_Breeze 发表于 2021-4-3 14:36

python 字符串处理,歌词处理

# Python 字符串分割

## 源字符串

```python
lyric = r"让你感觉我的心再说爱你 - 彭家丽不愿说别离 我紧紧拥着你让你听见我的心 在偷偷的叹息过去所有的回忆 我会放在我心里我会永远为你而美丽不愿道别离 我紧紧吻着你吻**的忧郁 你的泪滴在每个深沉夜里 每一个梦里我会用我的真心好好爱你"
```

## 要求

```bash



让你感觉我的心再说爱你 - 彭家丽
不愿说别离 我紧紧拥着你
让你听见我的心 在偷偷的叹息
过去所有的回忆 我会放在我心里
我会永远为你而美丽
不愿道别离 我紧紧吻着你
吻**的忧郁 你的泪滴
在每个深沉夜里 每一个梦里
我会用我的真心好好爱
```

# 分析,思路

## 可直接处理

**** 和 **** 单独一行

## 不可直接处理

**** **** **** 需要和其它的元素包含在一行

### 处理 ar 和 al

采用正则去匹配它

```python
pattern1 = re.compile("(\:.*?\])")
```

**** **** 相邻 ,只需要判断下一个元素不符合正则表达式就排除。

### 处理**** *******

有两种情况

正则表达式

```python
pattern = re.compile("(\[\d+:\d+\.\d+\])")
```

**** 后面跟字符串 或者 相同格式,然后再跟字符串

## 找【包含内容】

它们都是被 【 】保函, 只需要定位 **"[" "]"** 的位置,就可以找到被包含的内容

<!--如果出现多级嵌套"[" "]",那就难了-->

使用 **s.find** 找到就返回坐标,没有返回 -1

# 执行思路

### 从头开始查找 **"["** 再找 **"]"** 分别保留字符所在位置,然后截取中间内容:

**temp_str** 保存字符串 它是累加的

```python
if lyric.find("[", start, lyric_len) != -1:
    start = lyric.find("[", start, lyric_len)
    end = lyric.find("]", start, lyric_len)
    temp_str += lyric
```

### 在与 2 个 正则匹配:

**pattern.search(temp_str)** 匹配 ****

**pattern1.search(temp_str, re_flag, len(temp_str)** 匹配 **** **** ,它是从 第一次匹配到的长度开始匹配下一次的结果:

比如:

​        第一次为 字符串为 **temp_str**=****, re_flag = len(**temp_str** )

​        第二次 **temp_str**+= ****

​                <!-- temp_str = -->

​        它只会匹配**** 第二次结果,第一次跳过

```python
if pattern.search(temp_str) or pattern1.search(temp_str, re_flag, len(temp_str)):
```

​        匹配:

####                                 再找 **"]"** 后面是否紧跟着 **"["**

```python
          if (lyric) == "[":
```

​                                        是(出现这种情况 **** **** ****):

​                                                                还需要匹配下一个 **"[]"** 里面的内容,将 start 移动到 **"]"** 的位置,开始累加,继续执行

```python
                re_flag = len(temp_str)
                start = end
                        continue
```

​                                   不是( **** 字符串):

​                                                过去所有的回忆 我会放在我心里[**00:41.80]

​                                                找出字符串的位置。被 **"] ["**包含

​                                                把字符串储存起来, **re_flag** 复位

```python
                end_start = lyric.find("[", end, lyric_len)
                temp_str += lyric
                re_flag = 0
```



#### 检查过多匹配

```python

```

**** 过多匹配 需要回退到这个字符串开始

如果匹配标记为0 没有出现过多匹配不需要回退

```python
    if re_flag != 0:
      temp_str = temp_str
      end = start # 回退
```
### 清空信息

```python
result.append(temp_str)
temp_str = ""
start = end
re_flag = 0
```



### 不匹配直接退出循环。



# 完成代码

```python
import re
   
   
pattern = re.compile("(\[\d+:\d+\.\d+\])")
pattern1 = re.compile("(\:.*?\])")
re_flag = 0;

lyric = r"让你感觉我的心再说爱你 - 彭家丽不愿说别离 我紧紧拥着你让你听见我的心 在偷偷的叹息过去所有的回忆 我会放在我心里我会永远为你而美丽不愿道别离 我紧紧吻着你吻**的忧郁 你的泪滴在每个深沉夜里 每一个梦里我会用我的真心好好爱你"
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
      if pattern.search(temp_str) or pattern1.search(temp_str, re_flag, len(temp_str)):
            if (lyric) == "[":
                re_flag = len(temp_str)
                start = end
                continue
            else:
                end_start = lyric.find("[", end, lyric_len)
                temp_str += lyric
                re_flag = 0
      if re_flag != 0:
            temp_str = temp_str
            end = start # 回退
      result.append(temp_str)
      temp_str = ""
      start = end
      re_flag = 0
    else: break

print("="*50)

for n in result:
    print(f"{n}")
```

mettle 发表于 2021-4-3 21:42

学习学习不错不错!
页: [1]
查看完整版本: python 字符串处理,歌词处理