鱼C论坛

 找回密码
 立即注册
查看: 149|回复: 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字符。

以下是具体实现方法:
import re

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

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

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

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

# 遍历分段并合并
for i in range(0, len(segments), 2):
    text = segments[i]
    delimiter = segments[i + 1] if i + 1 < len(segments) else ""
    
    if current_length + len(text) + len(delimiter) > 1000:
        chunks.append(current_chunk)
        current_chunk = text + delimiter
        current_length = len(text) + len(delimiter)
    else:
        current_chunk += text + delimiter
        current_length += len(text) + len(delimiter)

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

# 打印结果块
for chunk in chunks:
    print(chunk)
    print("-" * 20)  # 仅用作分割显示,实际使用时可去掉

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

zh_text = "你好,世界!今天是个好日子。"
for chunk in re.split(r"([,。!])", zh_text):
    if re.match(r"[,。!]", chunk):
        print(chunk)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那想把文本及分割符 一并打印,该怎么改呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

分隔符 能跟在前一段文本后面吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

# 遍历并组合文本和分隔符
for i in range(0, len(segments), 2):
    text = segments[i]
    if i + 1 < len(segments):
        text += segments[i + 1]
    print(text)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

zh_text = "你好,世界!今天是个好日子。明天也是好日子. 后天更是好日子。"
分隔符是。或者. 这2个符号
该怎么写呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

# 遍历并组合文本和分隔符
for i in range(0, len(segments), 2):
    text = segments[i]
    if i + 1 < len(segments):
        text += segments[i + 1]
    print(text)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


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

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

以下是具体实现方法:
import re

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

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

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

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

# 遍历分段并合并
for i in range(0, len(segments), 2):
    text = segments[i]
    delimiter = segments[i + 1] if i + 1 < len(segments) else ""
    
    if current_length + len(text) + len(delimiter) > 1000:
        chunks.append(current_chunk)
        current_chunk = text + delimiter
        current_length = len(text) + len(delimiter)
    else:
        current_chunk += text + delimiter
        current_length += len(text) + len(delimiter)

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

# 打印结果块
for chunk in chunks:
    print(chunk)
    print("-" * 20)  # 仅用作分割显示,实际使用时可去掉

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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个空行,怎么不起作用呢?
想知道小甲鱼最近在做啥?请访问 -> 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, ...


代码如下:
import re

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

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

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

# 遍历分段并合并
for i in range(0, len(segments), 2):
    text = segments[i]
    delimiter = segments[i + 1] if i + 1 < len(segments) else ""
    
    if current_length + len(text) + len(delimiter) > 1000:
        chunks.append(current_chunk)
        current_chunk = text + delimiter
        current_length = len(text) + len(delimiter)
    else:
        current_chunk += text + delimiter
        current_length += len(text) + len(delimiter)

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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