首页 > 解决方案 > 正则表达式在所有标点符号和英文字符序列处拆分,并在 Python 中使用注音保留分隔符

问题描述

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

对于这样的字符串

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

我如何将它标记为

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

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

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

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

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

标签: pythonregextokenize

解决方案


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

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

查看在线演示

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

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

结果是:

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

推荐阅读