在Python中,从单词中分离/标记点,但不从数字中分离/标记点

在Python中,从单词中分离/标记点,但不从数字中分离/标记点,python,tokenize,Python,Tokenize,我试图将德语句子中的点与单词分开,而不是与数字分开,例如: "Der 17. Januar war ein toller Tag. Heute ist es auch schön." 应该以 "Der 17. Januar war ein toller Tag . Heute ist es auch schön . " 但我找不到解决办法。我尝试在Python中使用re模块,但没有成功 line = re.sub(r'[^0-9]+\.', ' . ', line) 就这样结束了 "Der

我试图将德语句子中的点与单词分开,而不是与数字分开,例如:

"Der 17. Januar war ein toller Tag. Heute ist es auch schön."
应该以

"Der 17. Januar war ein toller Tag . Heute ist es auch schön . "
但我找不到解决办法。我尝试在Python中使用
re
模块,但没有成功

line = re.sub(r'[^0-9]+\.', ' . ', line)
就这样结束了

"Der 17. Januar war ein toller Ta . Heute ist es auch schö . "

您必须在正则表达式中使用正向查找:

import re
s = "Der 17. Januar war ein toller Tag. Heute ist es auch schön."
final_string = re.sub("(?<=[a-zA-Z])\.(\s|$)", ' . ', s)
print(final_string)

以防万一,你不想使用正则表达式。这里有一个替代方案

def tokenize_using_dot(s_input):
    s_list = s_input.split()

    for idx in range(len(s_list)):
        if s_list[idx][-1] == '.' and not s_list[idx][0:-1].isdigit():
            s_list[idx] = s_list[idx].replace('.', ' .')
    return' '.join(s_list)


s = "Der 17. Januar war ein toller Tag. Heute ist es auch schön."
print(tokenize_using_dot(s))
输出:

 Der 17. Januar war ein toller Tag . Heute ist es auch schön .

正如@phg所评论的,对于这些类型的任务,最好使用nltk中合适的标记器

也许是XY问题。如果这应该是NLP管道的一部分,那么应该使用适当的标记器。就像在或(我知道spacy内置了一个德国模型;不确定NLTK。)。谢谢!正则表达式工作得非常好,此外,我可以轻松地修改它以解决一些类似的问题:)
 Der 17. Januar war ein toller Tag . Heute ist es auch schön .