如何拆分句子,包括标点符号

时间:2016-09-05 12:27:38

标签: string python-3.x split punctuation

如果我有sentence = 'There is light!'这句话并且我要将这句话与mysentence = sentence.split()分开,那么我如何将'There, is, light, !'作为print(mysentence)的输出?我特别想要做的是分割句子,包括所有标点符号,或者只是选择标点符号的列表。我得到了一些代码,但程序正在识别单词中的字符,而不是单词。

out = "".join(c for c in punct1 if c not in ('!','.',':'))
out2 = "".join(c for c in punct2 if c not in ('!','.',':'))
out3 = "".join(c for c in punct3 if c not in ('!','.',':'))

如何在不识别单词中的每个字符的情况下使用它,而不是识别单词本身。因此,"Hello how are you?"的输出应该变为"Hello, how, are, you, ?"任何方式执行此操作

1 个答案:

答案 0 :(得分:2)

您可以使用\w+|[^\w\s]+正则表达式与re.findall来获取这些块:

\w+|[^\w\s]

请参阅regex demo

模式详情

  • \w+ - 一个或多个单词字符(字母,数字或下划线)
  • | - 或
  • [^\w\s] - 除了word / whitespace之外的1个字符

Python demo

import re
p = re.compile(r'\w+|[^\w\s]')
s = "There is light!"
print(p.findall(s))

注意:如果您想将下划线视为标点符号,则需要使用类似[a-zA-Z0-9]+|[^A-Za-z0-9\s]模式的内容。

更新(评论后)

要确保您将撇号作为字词的一部分进行匹配,请将(?:'\w+)*(?:'\w+)?添加到上述模式中的\w+

import re
p = re.compile(r"\w+(?:'\w+)*|[^\w\s]")
s = "There is light!? I'm a human"
print(p.findall(s))

请参阅updated demo

(?:'\w+)*匹配零或更多(*,如果您使用?,则会匹配1或0)撇号后跟1个字符。