正则表达式拆分所有标点符号和英文字符序列并在 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}
\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', 'ㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']
如何将具有一组固定符号 (注音)、标点符号和英文字符的字符串标记为注音序列(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}
\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', 'ㄗㄞˋ', '『', 'ㄅㄠˇ', 'ㄏㄨˋ', '』', 'ㄍㄜ˙', 'ㄗ', ',', 'ㄉㄜ˙', '「', 'ㄑㄧㄢˊ', 'ㄊㄧˊ', '」', 'ㄒㄧㄚˋ', '。']