【问题标题】:How to split sentence including punctuation如何拆分包含标点符号的句子
【发布时间】:2017-01-12 19:49:25
【问题描述】:

如果我有句子 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, ?" 这样做的任何方式

【问题讨论】:

  • 您想获取非空白文本块的列表吗?
  • 我特别想做的是拆分句子,包括所有标点符号,或者只是一个选定标点符号的列表,因此如果用户用逗号写一个句子,逗号将被识别为一个单词。
  • 我已经为我的问题添加了一些描述
  • 我不想去掉标点符号

标签: string python-3.x split punctuation


【解决方案1】:

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

\w+|[^\w\s]

regex demo

模式详情

  • \w+ - 1 个或多个单词字符(字母、数字或下划线)
  • | - 或
  • [^\w\s] - 除了单词/空格之外的 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] 之类的模式。

更新(在 cmets 之后)

为确保将撇号匹配为单词的一部分,请将(?:'\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 个以上的单词字符。

【讨论】:

  • 谢谢,我试试
  • 如果有两种标点符号并排出现怎么办,比如('你在做什么?!')
  • 如果您想将它们作为单独的项目,请删除第二个+,我更新了答案。
  • 还有一个问题
  • 如何忽略撇号
猜你喜欢
  • 1970-01-01
  • 2012-01-22
  • 2013-04-14
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多