python - 正则表达式在所有标点符号和英文字符序列处拆分,并在 Python 中使用注音保留分隔符
问题描述
如何将具有一组固定符号(注音)、标点符号和英文字符的字符串标记为注音序列(空格分隔但有时由标点符号或英文字符连接)、单个标点符号和英文字符序列?
对于这样的字符串
"ㄉㄢˋ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}
查看在线演示
\p{Bopomofo}+
- 任意一个或多个注音字。[ˋˇ˙ˊ]?
- 给定字符中的可选字符。|
- 替代(或)
\p{Latin}+
- 任何一个或多个拉丁字符(也会捕获逗号)。|
- 替代(或)
\p{P}
- 任何一种标点符号。
import regex
text = 'ㄉㄢˋNCCㄗㄞˋ『ㄅㄠˇ ㄏㄨˋ』ㄍㄜ˙ ㄗ,ㄉㄜ˙「ㄑㄧㄢˊ ㄊㄧˊ」ㄒㄧㄚˋ。'
lst = regex.findall(r'\p{Bopomofo}+[ˋˇ˙]?|\p{Latin}+|\p{P}', text)
print(lst)
结果是:
['ㄉㄢˋ', 'NCC', 'ㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']
推荐阅读
- c++ - 为什么gcc解析第一个return子句后不能推断出返回值类型?
- powershell - 获取当前用户的 ObjectGUID
- for-loop - 无法弄清楚我的 for 循环中有什么语法错误
- css - 使用 Flexbox 将图像水平和垂直居中时图像的顶部被裁剪
- excel - 是否可以制作一个可以搜索谷歌电子表格并返回特定单元格值的电报机器人?
- javascript - 无法让数据表编辑器初始化
- scala - 具有无标签最终样式的 Kleisli 依赖项
- sharepoint - 如何在 PowerApps 中解析 JSON?
- python - 达到阈值后,累积熊猫列“重置”
- docker - 在托管 Angular 应用程序的 nginx docker 容器上配置 HTTPS