我需要使用每个字符string.punctuation和string.whitespace作为分隔符来分割数据字符串.
此外,我需要将分隔符保留在输出列表中,在它们在字符串中分隔的项之间.
例如,
"Now is the winter of our discontent"
Run Code Online (Sandbox Code Playgroud)
应该输出:
['Now', ' ', 'is', ' ', 'the', ' ', 'winter', ' ', 'of', ' ', 'our', ' ', 'discontent']
Run Code Online (Sandbox Code Playgroud)
我不知道如何在不诉诸嵌套循环的狂欢的情况下如何做到这一点,这是不可接受的慢.我该怎么做?
DSM*_*DSM 21
与其他人不同的非正则表达式方法:
>>> import string
>>> from itertools import groupby
>>>
>>> special = set(string.punctuation + string.whitespace)
>>> s = "One two three tab\ttabandspace\t end"
>>>
>>> split_combined = [''.join(g) for k, g in groupby(s, lambda c: c in special)]
>>> split_combined
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t ', 'end']
>>> split_separated = [''.join(g) for k, g in groupby(s, lambda c: c if c in special else False)]
>>> split_separated
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t', ' ', 'end']
Run Code Online (Sandbox Code Playgroud)
我想可以使用dict.fromkeys而.get不是lambda.
[编辑]
一些解释:
groupby接受两个参数,一个可迭代的和一个(可选的)键函数.它循环遍历iterable并使用keyfunction的值对它们进行分组:
>>> groupby("sentence", lambda c: c in 'nt')
<itertools.groupby object at 0x9805af4>
>>> [(k, list(g)) for k,g in groupby("sentence", lambda c: c in 'nt')]
[(False, ['s', 'e']), (True, ['n', 't']), (False, ['e']), (True, ['n']), (False, ['c', 'e'])]
Run Code Online (Sandbox Code Playgroud)
其中具有关键函数的连续值的术语被组合在一起.(这是错误的常见原因,其实 - 人们忘记了自己已经通过第一,如果他们想组而言这可能不是连续的keyfunc排序.)
正如@JonClements猜测的那样,我想到的是
>>> special = dict.fromkeys(string.punctuation + string.whitespace, True)
>>> s = "One two three tab\ttabandspace\t end"
>>> [''.join(g) for k,g in groupby(s, special.get)]
['One', ' ', 'two', ' ', 'three', ' ', 'tab', '\t', 'tabandspace', '\t ', 'end']
Run Code Online (Sandbox Code Playgroud)
对于我们组合分离器的情况. 如果值不在dict中,则.get返回None.
import re
import string
p = re.compile("[^{0}]+|[{0}]+".format(re.escape(
string.punctuation + string.whitespace)))
print p.findall("Now is the winter of our discontent")
Run Code Online (Sandbox Code Playgroud)
我不喜欢使用正则表达式解决所有问题,但如果你想快速和简短,我认为你没有太多选择.
我会解释正则表达式,因为你不熟悉它:
[...] 表示方括号内的任何字符[^...]表示不在方括号内的任何字符+后面是指一个或多个前一个东西x|y意味着要匹配x或y所以,正则表达式1个或多个字符,其中无论是匹配所有必须的标点符号和空格,或者没有一定.该findall方法查找模式的所有非重叠匹配.
| 归档时间: |
|
| 查看次数: |
5660 次 |
| 最近记录: |