鱼C论坛

 找回密码
 立即注册
查看: 408|回复: 11

[已解决]怎么表示re.split里捕获到的标点?

[复制链接]
发表于 2024-10-27 09:32:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
for chunk in re.split(r"([\.。])", zh_text):
    print(r'\g<0>')
最佳答案
2024-10-27 10:22:55
blackantt 发表于 2024-10-27 10:22
如果 zh_text 是长为5000字符的包含。和. 这两种分界 ...


要在5000字符长度的文本中通过 `。` 或 `.` 分块,每块不超过1000字符,并且分界符跟在文本后面,可以按以下步骤实现:

1. 使用正则表达式 `re.split` 将文本按 `。` 和 `.` 分隔并保留分隔符。
2. 遍历分割后的结果,依次合并块,确保每块长度不超过1000字符。

以下是具体实现方法:

  1. import re

  2. zh_text = "......"  # 假设这是你的5000字符长的文本

  3. # 使用正则表达式捕获所有句号和点号
  4. parts = re.split(r"([。\.])", zh_text)

  5. # 去除空字符串
  6. segments = list(filter(None, parts))

  7. # 用于存储最终分块结果的列表
  8. chunks = []
  9. current_chunk = ""
  10. current_length = 0

  11. # 遍历分段并合并
  12. for i in range(0, len(segments), 2):
  13.     text = segments[i]
  14.     delimiter = segments[i + 1] if i + 1 < len(segments) else ""
  15.    
  16.     if current_length + len(text) + len(delimiter) > 1000:
  17.         chunks.append(current_chunk)
  18.         current_chunk = text + delimiter
  19.         current_length = len(text) + len(delimiter)
  20.     else:
  21.         current_chunk += text + delimiter
  22.         current_length += len(text) + len(delimiter)

  23. # 把最后一个块添加到结果列表中
  24. if current_chunk:
  25.     chunks.append(current_chunk)

  26. # 打印结果块
  27. for chunk in chunks:
  28.     print(chunk)
  29.     print("-" * 20)  # 仅用作分割显示,实际使用时可去掉
复制代码


这样,程序会将文本按 `。` 和 `.` 分块,每块尽量维持不超过1000字符,并且分隔符跟在文本后面。`chunks` 列表中保存了每个符合要求的文本块。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-27 09:38:51 | 显示全部楼层
在 `re.split()` 中使用捕获组时,被捕获的部分也会作为分隔符出现在结果列表中。为了打印标点,你可以调整正则表达式来捕获标点符号。

例如,假设 `zh_text` 中标点符号要分隔并捕获,可以这样做:

  1. import re

  2. zh_text = "你好,世界!今天是个好日子。"
  3. for chunk in re.split(r"([,。!])", zh_text):
  4.     if re.match(r"[,。!]", chunk):
  5.         print(chunk)
复制代码


这样,循环中就可以识别并打印出标点符号。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-27 09:53:16 | 显示全部楼层
FishC 发表于 2024-10-27 09:38
在 `re.split()` 中使用捕获组时,被捕获的部分也会作为分隔符出现在结果列表中。为了打印标点,你可以调整 ...

那想把文本及分割符 一并打印,该怎么改呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-27 09:53:21 | 显示全部楼层
blackantt 发表于 2024-10-27 09:53
那想把文本及分割符 一并打印,该怎么改呢?


您可以直接遍历 `re.split()` 的结果并打印每个部分,不论是文本还是标点:

  1. import re

  2. zh_text = "你好,世界!今天是个好日子。"
  3. # 使用正则表达式捕获标点
  4. for chunk in re.split(r"([\,\!\。\?])", zh_text):
  5.     print(chunk)
复制代码


这里正则表达式 `([\,\!\。\?])` 用捕获组 `()`,捕获并保留标点符号。这样每个文本和标点都会出现在结果列表中。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-27 10:02:29 | 显示全部楼层
FishC 发表于 2024-10-27 09:53
您可以直接遍历 `re.split()` 的结果并打印每个部分,不论是文本还是标点:

分隔符 能跟在前一段文本后面吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-27 10:02:35 | 显示全部楼层
blackantt 发表于 2024-10-27 10:02
分隔符 能跟在前一段文本后面吗?


要让分隔符跟在前一段文本后面,可以先使用 `re.split()` 分隔,然后按照顺序组合文本和分隔符:

  1. import re

  2. zh_text = "你好,世界!今天是个好日子。"
  3. # 使用正则表达式捕获标点
  4. parts = re.split(r"()", zh_text)
  5. # 去除首尾空字符串和空格等无效元素
  6. segments = list(filter(None, parts))

  7. # 遍历并组合文本和分隔符
  8. for i in range(0, len(segments), 2):
  9.     text = segments[i]
  10.     if i + 1 < len(segments):
  11.         text += segments[i + 1]
  12.     print(text)
复制代码


这样每段文本后都会跟上相应的分隔符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-27 10:10:38 | 显示全部楼层
FishC 发表于 2024-10-27 10:02
要让分隔符跟在前一段文本后面,可以先使用 `re.split()` 分隔,然后按照顺序组合文本和分隔符:

zh_text = "你好,世界!今天是个好日子。明天也是好日子. 后天更是好日子。"
分隔符是。或者. 这2个符号
该怎么写呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-27 10:10:44 | 显示全部楼层
blackantt 发表于 2024-10-27 10:10
zh_text = "你好,世界!今天是个好日子。明天也是好 ...


可以使用捕获组对 `。` 和 `.` 进行分隔和保留。以下是具体代码:

  1. import re

  2. zh_text = "你好,世界!今天是个好日子。明天也是好日子. 后天更是好日子。"
  3. # 使用捕获组来捕获句号和点号
  4. parts = re.split(r"([。.])", zh_text)

  5. # 去除空字符串
  6. segments = list(filter(None, parts))

  7. # 遍历并组合文本和分隔符
  8. for i in range(0, len(segments), 2):
  9.     text = segments[i]
  10.     if i + 1 < len(segments):
  11.         text += segments[i + 1]
  12.     print(text)
复制代码


这样,文本片段会跟着它们的分隔符一起打印。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-27 10:22:48 | 显示全部楼层
如果 zh_text 是长为5000字符的包含。和. 这两种分界符的文本。 要以。或者. 分块,每块字符长度不超过1000,分界符应该跟在文本后面。    该怎么改写上面的代码呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-27 10:22:55 | 显示全部楼层    本楼为最佳答案   
blackantt 发表于 2024-10-27 10:22
如果 zh_text 是长为5000字符的包含。和. 这两种分界 ...


要在5000字符长度的文本中通过 `。` 或 `.` 分块,每块不超过1000字符,并且分界符跟在文本后面,可以按以下步骤实现:

1. 使用正则表达式 `re.split` 将文本按 `。` 和 `.` 分隔并保留分隔符。
2. 遍历分割后的结果,依次合并块,确保每块长度不超过1000字符。

以下是具体实现方法:

  1. import re

  2. zh_text = "......"  # 假设这是你的5000字符长的文本

  3. # 使用正则表达式捕获所有句号和点号
  4. parts = re.split(r"([。\.])", zh_text)

  5. # 去除空字符串
  6. segments = list(filter(None, parts))

  7. # 用于存储最终分块结果的列表
  8. chunks = []
  9. current_chunk = ""
  10. current_length = 0

  11. # 遍历分段并合并
  12. for i in range(0, len(segments), 2):
  13.     text = segments[i]
  14.     delimiter = segments[i + 1] if i + 1 < len(segments) else ""
  15.    
  16.     if current_length + len(text) + len(delimiter) > 1000:
  17.         chunks.append(current_chunk)
  18.         current_chunk = text + delimiter
  19.         current_length = len(text) + len(delimiter)
  20.     else:
  21.         current_chunk += text + delimiter
  22.         current_length += len(text) + len(delimiter)

  23. # 把最后一个块添加到结果列表中
  24. if current_chunk:
  25.     chunks.append(current_chunk)

  26. # 打印结果块
  27. for chunk in chunks:
  28.     print(chunk)
  29.     print("-" * 20)  # 仅用作分割显示,实际使用时可去掉
复制代码


这样,程序会将文本按 `。` 和 `.` 分块,每块尽量维持不超过1000字符,并且分隔符跟在文本后面。`chunks` 列表中保存了每个符合要求的文本块。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-27 23:27:16 | 显示全部楼层
FishC 发表于 2024-10-27 10:22
要在5000字符长度的文本中通过 `。` 或 `.` 分块,每块不超过1000字符,并且分界符跟在文本后面,可以 ...

for chunk in chunks:
    chunk = re.sub(r'\n\s{2,}\n', '\n', chunk)
    print(chunk)
想用以上代码将输出中存在的多个连续空行  替换成1个空行,怎么不起作用呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-27 23:33:47 | 显示全部楼层
blackantt 发表于 2024-10-27 23:27
for chunk in chunks:
    chunk = re.sub(r'\n\s{2, ...


代码如下:

  1. import re

  2. zh_text = "你好,世界!今天是个好日子。明天也是好日子. 后天更是好日子。你说呢?这个东西应该不错吧. 是的."
  3. # 使用正则表达式捕获所有句号和点号
  4. parts = re.split(r"([。\.])", zh_text)

  5. # 去除首尾的空字符串
  6. segments = list(filter(None, parts))

  7. # 用于存储分块结果的列表
  8. chunks = []
  9. current_chunk = ""
  10. current_length = 0

  11. # 遍历分段并合并
  12. for i in range(0, len(segments), 2):
  13.     text = segments[i]
  14.     delimiter = segments[i + 1] if i + 1 < len(segments) else ""
  15.    
  16.     if current_length + len(text) + len(delimiter) > 1000:
  17.         chunks.append(current_chunk)
  18.         current_chunk = text + delimiter
  19.         current_length = len(text) + len(delimiter)
  20.     else:
  21.         current_chunk += text + delimiter
  22.         current_length += len(text) + len(delimiter)

  23. # 添加最后一个块
  24. if current_chunk:
  25.     chunks.append(current_chunk)

  26. # 处理分块,去除多个连续空行(使用re.sub)
  27. for chunk in chunks:
  28.     chunk = re.sub(r'\n\s*\n', '\n', chunk)
  29.     print(chunk)
  30.     print('-' * 20)
复制代码


这样,输出的文本块中连续多个空行就被替换为一个空行。

**解释代码调整的关键**:

1. 使用 `re.split(r"([。\.])", zh_text)` 确保捕获并保留标点符号 `。` 和 `.` 作为分割符,而不是 `r"()"`。
2. 将 `re.sub(r'\n\s*\n', '\n', chunk)` 用于替换多个连在一起的空行,其中 `\s*` 匹配任意个空白字符,确保任何空白行都被替换成单个空行。

现在代码将正确地将文本分块,并在打印时替换掉多余的空行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 16:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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