也许在字符串中添加额外的句子/单词

时间:2012-05-23 11:09:03

标签: python string

我必须多次创建与此类似的代码:

if condition():
    word = " not"
else:
    word = ""

print "A five ounce bird could{0} carry a one pound coconut".format(word)

我已经将问题解决了这里的问题,在“练习”中,"A""five""bird""a"会有额外的变量, "one""coconut"以便它们可能全部改变,并与它们一起添加多个s-es和诸如此类的东西。

总是令我感到震惊,但不如说令人满意。 "not"之前所需的额外空间以及{0}之前缺少空格,但是因为如果word为空,我不想要两个空格,我看不到任何空格其他方式。

使用DRY创建两个单独的消息中断,由于可能的组合数量,有时甚至不可行。

有更优雅的方法吗?

7 个答案:

答案 0 :(得分:3)

创建单词列表,必要时插入,然后' '.join(words)

如果有逗号/句点,请构建句子结构:

[['If', 'there', 'are', 'periods'], ', ', ['build', 'a', 'sentence', 'structure'], '.']

在interpunction中有相应的空格(逗号后的空格,括号前的空格,......)然后' '.join()组内的单词和''.join()个别组。 (感谢@Alfe提出的加入单词和组的建议不同)。

答案 1 :(得分:2)

  

使用DRY创建两个单独的消息中断

如果你关心i18n,那么创建两个单独的消息可能是唯一合理的方法。

答案 2 :(得分:1)

对于" not"案例,请保持简单:

print "A five ounce bird could{0} carry a one pound coconut".format(" not" if condition() else "")

答案 3 :(得分:1)

我会......

word = ("could" if not condition() else "could not")

print "A five ounce bird {0} carry a one pound coconut".format(word)

:P

编辑:对于一般情况,这就是你想要的,我会按照构图去做。例如。 (好吧,这也是我喜欢的Go4和简单化,但重点突出):

class Agglutinator(list):
    def __str__(self):
        return self._separator.join(str(x) for x in self)


class Paragraph(Agglutinator):
    """Returns dot separated sentences""" 
    _separator = '. '

class Sentence(Agglutinator):
    """Returns comma separated clauses""" 
    _separator = ', '

class Clause(Agglutinator):
    """Returns space separated words"""
    _separator = ' '

c1 = Clause(["A", "number", "of", "words", "make", "a", "clause"])
c2 = Clause(["and", "a", "number", "of", "clauses", "make", "a", "sentence"])
c3 = Clause(["A", "collection", "of", "sentences", "makes", "a", "paragraph"])

s1 = Sentence([c1, c2])
s2 = Sentence([c3])

print Paragraph([s1, s2])

给你:

A number of words make a clause, and a number of clauses make a sentence. A collection of sentences makes a paragraph

稍微阐述一下你可以让Sentence大写第一个单词等等。

答案 4 :(得分:1)

由于空格必须在哪里以及哪些不清楚的规则用英语(以及我所知道的其他语言),你可以使用所有句子部分的简单列表(例如['If', 'there', 'are', 'commas', ',', 'we', 'insert', 'them', '.']),然后写一个专门的join函数,它适用于必须插入空格的英语规则(例如,在逗号之后,在开括号之前,......之间)。

答案 5 :(得分:1)

另一种处理此问题的方法,但我不确定它是否是您正在寻找的

word = "not"

print "A five ounce bird could{0} carry a one pound coconut".format(" "+word if condition() else "")

好的,还有一种方法。但事实上,几乎所有这些都相似或相同......

def format_word(word):
    if word:
        return " " + word
    else:
        return ""

print "A five ounce bird could{0} carry a one pound coconut".format(format_word(word))

但可能,所有这些看起来都很不舒服,因为它们实际上是相似的......

最终方法可能是:

if condition():
    word = "not"
else:
    word = ""

wrd =  "A five ounce bird could {0} carry a one pound coconut".format(word)
print wrd.replace("  ", " ") # replace all double spaces with singular one...

但是,它也很脏......

答案 6 :(得分:0)

我会增加另一种可能性,我只是想到了自己。子类string.Formatter并添加自定义转换器,因此您可以键入

fmt = MyFormatter()
print fmt("Problem {not!w} solved", not="")

如果变量为空/未指定,格式化程序将使用!w转换器删除所有字段前的空格。这需要至少重新实现vformatconvert_field方法,但这应该是非常可行的。