我使用导入string
和string.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']
。
我想避免使用正则表达式,但是如果这是唯一的解决方案,那么我将考虑使用它。.目前,我对不借助正则表达式解决此问题更感兴趣。
答案 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
)将它们分组(ok
。 if ok
过滤掉与lambda不匹配的组。这些组是迭代器,必须将其转换为字符列表,然后再加入以获取单词。
isalnum()
的含义实质上是“是字母数字”。根据您的用例,您可能更喜欢isalpha()
。在这两种情况下,对于此输入:
s = 'a 狗 barks meow! @ …'
输出为
['a', '狗', 'barks', 'meow']
(对于专家:这使我们想起了一个问题,并非所有语言中的单词都由非单词字符分隔-e.g.)