不使用正则表达式

时间:2018-10-21 09:30:08

标签: python string python-3.x punctuation

我使用导入stringstring.punctuation,但是我意识到在进行'…'之后我仍然有string.split()。我还得到了'',我不知道为什么在完成strip(之后会得到它。据我了解,strip()除去了外围空格,因此,如果我在字符串之间有空格,那就没关系了:

>>> s = 'a dog    barks    meow!   @  … '
>>> s.strip()
'a dog    barks    meow!   @  …'


>>> import string
>>> k = []
>>> for item in s.split():
...  k.append(item.strip(string.punctuation))
... 
>>> k
['a', 'dog', 'barks', 'meow', '', '…']

我想摆脱'', '…',我想要的最终输出是['a', 'dog', 'barks', 'meow']

我想避免使用正则表达式,但是如果这是唯一的解决方案,那么我将考虑使用它。.目前,我对不借助正则表达式解决此问题更感兴趣。

3 个答案:

答案 0 :(得分:2)

您可以通过仅保留字母数字字符和空格来删除标点符号:

s = 'a dog    barks    meow!   @  …'
print(''.join(c for c in s if c.isalnum() or c.isspace()).split())

这将输出:

['a', 'dog', 'barks', 'meow']

答案 1 :(得分:0)

我使用了以下内容:

s = 'a dog    barks    Meow!   @  … '



import string
p = string.punctuation+'…'
k = []
for item in s.split():
    k.append(item.strip(p).lower())


k = [x for x in k if x]

答案 2 :(得分:0)

以对this question的公认答案为基础:

import itertools

k = []
for ok, grp in itertools.groupby(s, lambda c: c.isalnum()):
    if ok:
        k.append(''.join(list(grp)))

或与单线相同(进口除外):

k = [''.join(list(grp)) for ok, grp in itertools.groupby(s, lambda c: c.isalnum()) if ok]

itertools.groupby()将字符串s扫描为字符列表,并根据lambda表达式的值(grp)将它们分组(okif ok过滤掉与lambda不匹配的组。这些组是迭代器,必须将其转换为字符列表,然后再加入以获取单词。

isalnum()的含义实质上是“是字母数字”。根据您的用例,您可能更喜欢isalpha()。在这两种情况下,对于此输入:

s = 'a 狗    barks    meow!   @  …'

输出为

['a', '狗', 'barks', 'meow']

(对于专家:这使我们想起了一个问题,并非所有语言中的单词都由非单词字符分隔-e.g.