我认为我想要做是相当常见的任务,但是我发现没有引用在网站上。我有文本中的,标点符号,并且我想要的单词列表。

"Hey, you - what are you doing here!?"

应该是

['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

但 Python 的str.split()只适用于一个参数...因此,我有带标点的所有单词拆分与空白。您有何建议?

2009-06-29 17:49:35

回答:

在正则表达式对齐的情况︰

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

[包括'在中编辑单词字符-谢谢,Danosaure。]

谢谢。仍感兴趣,不过-如何实施本模块中所使用的算法?以及为什么它不出现在字符串模块?

正则表达式可以是令人望而生畏,首先,但都非常强大。正则表达式 w + 意味着"单词字符 (a 到 z 等) 重复的一个或多个时间"。还有如何在 Python 以下正则表达式︰ amk.ca/python/howto/regex

这还不能处理 unicode 很好-上面用撇号是U+0027,即 en_US 键盘上一个。此外,还有U+2019Unicode表示是首选的撇号表示。我经常看到此从其他源粘贴的文本中的字符。这看起来很靠近空白或首或行尾的标点可以编写正则表达式。我可能做到这一点时得到片刻:)

这不是问题的答案。这是另一个问题,恰好适用于此特定情况下的答案。就像有人询问"如何使左的转弯"和投票前的答案是"轮流接下来三个合适。"对于某些工作交集,但它无法提供所需的答案。篇幅有限,答案re,不只是findall下面提供re.split()的答案更胜一筹。

这不会与包含连字符 (的单词-).

re.split()

re.split (图案,字符串 [,maxsplit = 0])

拆分模式的匹配项的字符串。如果将捕获括号用于模式中,也作为生成的列表的一部分返回模式中的所有组的文本。如果 maxsplit 不为零,最大 maxsplit 分割发生,并且该字符串的其余部分将作为列表的最后一个元素返回。(不兼容性注︰ 在原始的 Python 1.5 版本中,maxsplit 已被忽略。此问题已修复在更高版本。)

>>> re.split('W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('W+', 'Words, words, words.', 1)
['Words', 'words, words.']

此解决方案是否很容易地被改编过拆分在下划线上的优点,但是某些 findall 解决方案不︰ 打印 re.split ("W + | _","测试 this_thing") 产生: ['测试'、 '本','事']

现在只要我能记得的区别wWsS人思想的一个标志,标志的大小写应当反其含义需要通过头进行拍摄。

另一个快速的方法来执行此操作而无需 regexp 是首先,如下所示替换的字符︰

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']

这是非常乏味。

快速和脏,但适合我的情况而言 (我的分隔符是一套小的、 已知)

非常适合于不到 RE 库中,如某些小的微控制器能访问的情况。:-)

我认为这是比转口,因此类型更明确的 noob 友好。有时不需要常规解决方案添加到的一切

看起来比解的正则表达式工具箱不太乏味...

如此多的答案,但我找不到任何解决方案,高效地没有标题的问题按其原义请求的内容 (与多个分隔符拆分 — — 很多答案相反,删除任何不是单词)。这是 Python 的标准和高效re模块所依赖的标题 ("string 有多个分隔符拆分") 中问题的答案︰

>>> import re
>>> # Splitting on: , <space> - ! ? :
>>> filter(None, re.split("[, -!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

其中︰

  • 正则表达式中的-这里是为防止-的特殊解释作为字符范围指示符,以及在何处
  • filter(None, …)删除空字符串可能是由前导和尾随分隔符 (因为空字符串具有布尔值 false)。

re.split()此精确"分隔带多个分隔符",如要求提供试题标题中。re模块是比"手动"执行 Python 循环和测试的效率高得多。

"找不到任何不高效的标题问题的真正要求的解决方案"-第二个答案执行此,投递 5 年前︰ stackoverflow.com/a/1059601/2642204.

此答案不拆分在分隔符 (从一组的多个分隔符)︰ 而是拆分处以外的任何字母数字。话虽如此,但我同意,可能是原始海报的目的继续只有单词,而不是删除某些标点符号。

EOL︰ 我认为这答案 does 拆分多个分隔符的一组。如果未指定,如下划线,字符串中添加非字母数字他们不拆分,如预期的那样。

@GravityWell︰ 我不确定我的理解︰ 您可以为一个具体的例子吗?

@EOL︰ 我刚刚意识到我是混淆的评论"此答案不拆分..."我认为"本"所说的 re.split 您的答案,但我现在意识到您是 gimel 的答案。我认为该答案 (回答到我注释):) 是最好的办法

另一种方法,而无需正则表达式

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()

此解决方案是接受一个比实际上更好。它适用于任何 ASCII 字符,请尝试"Hey, you - what are you doing here María!?"与前面的示例中无法接受的解决方案。

我认为小问题...您的代码将附加字符的标点符号分隔,从而不会拆分它们...如果我没有错误,您最后一行应该是︰ ''.join([o if not o in string.punctuation else ' ' for o in s]).split()

正则表达式库可用于接受 Unicode 字符在必要时的约定。此外,这仍出现相同问题接受的解决方案用来了︰ 现在是这样,因为拆分上撇号。您可能希望o for o in s if (o in not string.punctuation or o == "'"),但然后它获取太复杂的单行式命令如果我们还在 cedbeu 的修补程序中添加。

还有这里的另一个问题。即使我们考虑到客户的 @cedbeu,此代码所做的更改不起作用,如果字符串是一个像"First Name,Last Name,Street Address,City,State,Zip Code"和我们想要只拆分逗号,需要将输出: ['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']改为我们得到:['First', 'Name', 'Last', 'Name', 'Street', 'Address', 'City', 'State', 'Zip', 'Code']

此解决方案是很低效︰ 首先列表站点的拆解分析为单个字符,然后整组标点字符经历了原始字符串中的每个单个字符的最后装配后的字符,然后再次拆分。所有这种"移动"是非常复杂,太,与正则表达式基于解决方案︰ 即使在给定应用程序中,速度并不重要,没有必要使用复杂的解决方案。由于re模块是标准并提供可辨认性和速度,看不到它的 eschewed 为什么。

请输入您的翻译

Python - Split Strings with Multiple Delimiters

确认取消