正则表达式拆分所有标点符号和英文字符序列并在 Python 中保留带注音的分隔符

Regex split at all punctuations and English character sequences and keep delimiters with zhuyin in Python

如何将具有一组固定符号 (注音)、标点符号和英文字符的字符串标记为注音序列(space 分隔但有时由标点符号或英文字符连接)、单个标点符号和英文字符序列?

对于这样的字符串

"ㄉㄢˋNCCㄗㄞˋ『ㄅㄠˇ ㄏㄨˋ』ㄍㄜ˙ ㄗ,ㄉㄜ˙「ㄑㄧㄢˊ ㄊㄧˊ」ㄒㄧㄚˋ。"

如何将它标记为

['ㄉㄢˋ', 'NCC', ㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']

我目前正在使用列表理解和正则表达式模式

[seq for seq in re.split("([^\w˙])", input_str) if seq and seq != " "]

但这无法标记英文字符序列并产生这样的结果

['ㄉㄢˋNCCㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']

您可以使用 regex 模块代替 re 并在注音(或 Bopomofo)、拉丁文和标点符号之间交替使用。例如:

\p{Bopomofo}+[ˋˇ˙ˊ]?|\p{Latin}+|\p{P}

Online Demo

  • \p{Bopomofo}+ - 任意一个或多个注音字。
  • [ˋˇ˙ˊ]? - 给定字符中的可选字符。
    • | - 交替 (OR)
  • \p{Latin}+ - 任何一个或多个拉丁字符(也会捕获逗号)。
    • | - 交替 (OR)
  • \p{P} - 任何标点符号。

import regex
text = 'ㄉㄢˋNCCㄗㄞˋ『ㄅㄠˇ ㄏㄨˋ』ㄍㄜ˙ ㄗ,ㄉㄜ˙「ㄑㄧㄢˊ ㄊㄧˊ」ㄒㄧㄚˋ。'
lst = regex.findall(r'\p{Bopomofo}+[ˋˇ˙]?|\p{Latin}+|\p{P}', text)
print(lst)

结果:

['ㄉㄢˋ', 'NCC', 'ㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']