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}")
``` 学习学习不错不错!
页:
[1]