使用 RE 在 Python 中拆分输入以进行标记化

Splitting an input for tokenization in Python using RE

我正在尝试拆分要在 Python 中标记化的输入字符串,但到目前为止所做的所有尝试都会导致 Python "nothing to repeat" 投诉。

目前,我正在使用 re.findall 而不是 re.split,但我不确定我的正则表达式错误在哪里。

我当前的正则表达式如下所示:

inputList = re.findall(r"[\w']+|[.,!?;]|[\s]", testString)

我想按标点符号或空格拆分。

我之前尝试过:

inputList = re.split(r'(\s|\W)*', testString)

但这会给我不希望的输出字符串。

我也试过:

inputList = re.split(r'(\s+)|([.,!?;]+)', testString)

但是出现了同样的错误。

一个测试字符串的例子:

testString = "Beautiful King John! ??? I'm here. It's 'bout time."

所需输出示例:

['Beautiful', ' ', 'King', ' ', 'John', '!', ' ', '?', '?', '?', ' ', "I'm", ' ', 'here', '.', ' ', "It's", ' ', "'bout", ' ', 'time', '.']

我的 re.findall 得到了正确的输出,但是 Python 抛出了错误,如果可能的话,我想摆脱它。 有人可以指出我在使用正则表达式时犯的错误吗?

对于您的示例,此方法有效,但也给出了空字符串:

re.split(r'([ !?.])', testString)

# ['Beautiful', ' ', 'King', ' ', 'John', '!', '', ' ', '', '?', '', '?', '', '?', '', ' ', "I'm", ' ', 'here', '.', '', ' ', "It's", ' ', "'bout", ' ', 'time', '.', '']

但是你想要的输出只是一个过滤器操作:

inputList = [t for t in re.split(r'([ !?.])', t) if t]

# ['Beautiful', ' ', 'King', ' ', 'John', '!', ' ', '?', '?', '?', ' ', "I'm", ' ', 'here', '.', ' ', "It's", ' ', "'bout", ' ', 'time', '.']