8

说,如果我有这样的文字

text='a!a b! c!!!'

我想要这样的结果:

text='a!a b c'

所以,如果每个单词的结尾都是'!',我想摆脱它。如果有多个 '!' 总之一句话,全部被淘汰。

4

4 回答 4

9
print " ".join(word.rstrip("!") for word in text.split())
于 2013-04-16T22:48:37.150 回答
4

作为拆分/剥离方法的替代方案

" ".join(x.rstrip("!") for x in text.split())

它不会完全保留空格,您也许可以使用正则表达式,例如

re.sub(r"!+\B", "", text)

这会消除所有不是紧跟单词开头的感叹词。

于 2013-04-16T23:04:37.823 回答
2
import re
>>> testWord = 'a!a b! c!!!'
>>> re.sub(r'(!+)(?=\s|$)', '', testWord)
'a!a b c'

这保留了您的字符串中可能没有的任何额外空格str.split()

于 2013-04-16T23:02:20.820 回答
0

这是一种非正则表达式,非基于拆分的方法:

from itertools import groupby

def word_rstrip(s, to_rstrip):
    words = (''.join(g) for k,g in groupby(s, str.isspace))
    new_words = (w.rstrip(to_strip) for w in words)
    return ''.join(new_words)

这首先通过使用itertools.groupby根据它们是否为空格将连续字符组合在一起来起作用:

>>> s = "a!a b! c!!"
>>> [''.join(g) for k,g in groupby(s, str.isspace)]
['a!a', ' ', 'b!', ' ', 'c!!']

实际上,这就像保留空白的.split(). 一旦我们有了这个,我们就可以rstrip像往常一样使用,然后重新组合:

>>> [''.join(g).rstrip("!") for k,g in groupby(s, str.isspace)]
['a!a', ' ', 'b', ' ', 'c']
>>> ''.join(''.join(g).rstrip("!") for k,g in groupby(s, str.isspace))
'a!a b c'

我们也可以传递我们喜欢的任何东西:

>>> word_rstrip("a!! this_apostrophe_won't_vanish these_ones_will'''", "!'")
"a this_apostrophe_won't_vanish these_ones_will"
于 2013-04-17T02:09:59.047 回答