【问题标题】:In Python, how to take in a string text, and returns a list which contains lists of strings?在 Python 中,如何接收一个字符串文本,并返回一个包含字符串列表的列表?
【发布时间】:2014-11-06 15:35:55
【问题描述】:

此函数接受一个字符串文本,并返回一个包含字符串列表的列表,字符串文本中的每个句子对应一个列表。

句子由字符串 "."、"?" 或 "!" 之一分隔。 我们忽略了其他标点符号分隔句子的可能性。所以'Mr.X'会变成2个句子,'don't'会变成两个词。

比如文字是

Hello, Jack.  How is it going?  Not bad; pretty good, actually...  Very very
good, in fact.

然后函数返回:

 ['hello', 'jack'],
 ['how', 'is', 'it', 'going'],
 ['not', 'bad', 'pretty', 'good', 'actually'],
 ['very', 'very', 'good', 'in', 'fact']]

最令人困惑的部分是如何让函数检测字符 , . ! ?以及如何使它成为一个列表列表,其中包含每个句子中的单词。 谢谢。

【问题讨论】:

  • re.split("[.?!]",all_text) 应该为您提供第一部分,re.findall("[a-zA-Z]+",some_text) 将为您提供一段文本中的所有字母词(仅限字母)

标签: python string list text


【解决方案1】:

这听起来很像我的家庭作业问题,所以我将提供一般提示而不是确切的代码。

字符串上有 split(char) 函数。您可以使用它根据特定字符拆分字符串。但是,您将不得不使用循环并多次执行拆分。

您还可以使用正则表达式来查找匹配项(这将是一个更好的解决方案。)这样您就可以一次找到所有匹配项。然后,您将遍历匹配项并根据空格将它们吐出,同时去除标点符号。

编辑:这是一个正则表达式示例,您可以使用它来一次获取所有句子组:

\s*([^.?!]+)\s*

括号周围的 \s* 会导致从结果中删除任何多余的空格,括号是一个捕获组。您可以使用 re.findall() 获取所有捕获结果的列表,然后您可以遍历这些项目并使用 re.split() 和一些条件逻辑将所有单词附加到新列表中。

让我知道您是如何处理的,如果您有任何其他问题,请向我们提供您目前拥有的代码。

【讨论】:

  • 这里的匹配是什么意思?我不需要具体的解决方案,只需要详细的解释,谢谢!
  • 试用 regexhero.net 或其他一些正则表达式工具。其他用户遇到的“空行”问题是由于遗漏了一个 +,它指定了至少一个项目的捕获组。
  • @humberthumbert116,我注意到您没有选择接受的答案。如果您觉得我的回答解决了您的问题,请接受它,以便我得到代表。否则,如果您还有其他我可以帮助的问题,请告诉我。谢谢!
【解决方案2】:

你可以使用re.split()

>>> s="Hello, Jack.  How is it going?  Not bad; pretty good, actually...  Very very good, in fact."
>>> import re
>>> [re.split(r'\W',i) for i in re.split(r'\.|\?|\!',s) if len(i)]

对于删除空索引,您可以这样做:

>>> [[x for x in i if len(x)]for i in my_s]
[['Hello', 'Jack'], ['How', 'is', 'it', 'going'], ['Not', 'bad', 'pretty', 'good', 'actually'], ['Very', 'very', 'good', 'in', 'fact']]

【讨论】:

  • [.?!] 有什么问题?这也返回空字符串。
  • [.?!] 也可以使用,关于空字符串我会编辑答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多