blackantt 发表于 2024-10-27 09:32:33

怎么表示re.split里捕获到的标点?

for chunk in re.split(r"([\.。])", zh_text):
    print(r'\g<0>')

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 2024-10-27 09:53:16

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

那想把文本及分割符 一并打印,该怎么改呢?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 2024-10-27 10:02:29

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




分隔符 能跟在前一段文本后面吗?

FishC 发表于 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
    if i + 1 < len(segments):
      text += segments
    print(text)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 2024-10-27 10:10:38

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




zh_text = "你好,世界!今天是个好日子。明天也是好日子. 后天更是好日子。"
分隔符是。或者. 这2个符号
该怎么写呢?

FishC 发表于 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
    if i + 1 < len(segments):
      text += segments
    print(text)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 2024-10-27 10:22:48

如果 zh_text 是长为5000字符的包含。和. 这两种分界符的文本。 要以。或者. 分块,每块字符长度不超过1000,分界符应该跟在文本后面。    该怎么改写上面的代码呢?

FishC 发表于 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
    delimiter = segments 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 小助理,如未能正确解答您的问题,请继续追问。

blackantt 发表于 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个空行,怎么不起作用呢?

FishC 发表于 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
    delimiter = segments 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 怎么表示re.split里捕获到的标点?