根据Python中子字符串的顺序识别子字符串并返回响应

时间:2011-08-04 16:14:56

标签: python substring

我是Python的初学者,我在线自学Google Code University。字符串操作的练习之一如下:

# E. not_bad
# Given a string, find the first appearance of the
# substring 'not' and 'bad'. If the 'bad' follows
# the 'not', replace the whole 'not'...'bad' substring
# with 'good'.
# Return the resulting string.
# So 'This dinner is not that bad!' yields:
# This dinner is good!
def not_bad(s):
  # +++your code here+++
  return

我被困住了。我知道它可以使用ls = s.split(' ')放入列表中,然后排除各种元素,但我认为这可能只是为自己创建了额外的工作。该课程尚未涉及RegEx,因此该解决方案不涉及re。帮助

这是我尝试过的,但在所有情况下都没有正确地给出输出:

def not_bad(s):
  if s.find('not') != -1:
    notindex = s.find('not')
    if s.find('bad') != -1:
      badindex = s.find('bad') + 3
      if notindex > badindex:
        removetext = s[notindex:badindex]
        ns = s.replace(removetext, 'good')
      else:
        ns = s
    else:
      ns = s
  else:
    ns = s
  return ns

这是输出,它在1/4的测试用例中起作用:

not_bad
  X  got: 'This movie is not so bad' expected: 'This movie is good'
  X  got: 'This dinner is not that bad!' expected: 'This dinner is good!'
 OK  got: 'This tea is not hot' expected: 'This tea is not hot'
  X  got: "goodIgoodtgood'goodsgood goodbgoodagooddgood goodygoodegoodtgood  
     goodngoodogoodtgood" expected: "It's bad yet not"

测试案例:

print 'not_bad'
  test(not_bad('This movie is not so bad'), 'This movie is good')
  test(not_bad('This dinner is not that bad!'), 'This dinner is good!')
  test(not_bad('This tea is not hot'), 'This tea is not hot')
  test(not_bad("It's bad yet not"), "It's bad yet not")

更新:此代码解决了问题:

def not_bad(s):
  notindex = s.find('not')
  if notindex != -1:
    if s.find('bad') != -1:
      badindex = s.find('bad') + 3
      if notindex < badindex:
        removetext = s[notindex:badindex]
        return s.replace(removetext, 'good')
  return s

感谢大家帮助我找到解决方案(而不只是给我答案)!我很感激!

5 个答案:

答案 0 :(得分:3)

像这样分解:

  1. 你怎么知道单词“not”是否在字符串中?
  2. 你如何找出 字符串中的“not”字样,如果是的话?
  3. 如何在一次操作中合并#1和#2?
  4. 与#1-3相同,除了“坏”这个词?
  5. 鉴于你知道单词“not”和“bad”都在一个字符串中,你如何判断单词“not”后是否出现这个单词?
  6. 鉴于你知道“不好”出现在“不”之后,你怎么能得到“不”之前的字符串的每一部分?
  7. 你怎么能得到“坏”之后的字符串的每一部分?
  8. 你如何将#6和#7的答案结合起来,用“好”这个单词的开头替换所有单词,将“bad”单词的结尾替换为“good”?

答案 1 :(得分:3)

嗯,我认为是时候进行一次小评论了; - )

您的代码中存在错误:notindex > badindex应更改为notindex < badindex。更改的代码似乎工作正常。

我也对你的代码有一些评论:

  1. 通常的做法是计算一次值,将其分配给变量并在下面的代码中使用该变量。对于这个特殊情况,这条规则似乎是可以接受的:
  2. 例如,您的函数头可以替换为

    notindex = s.find('not')
    if notindex == -1:
    
    1. 您可以多次在函数内使用return
    2. 因此,代码的尾部可能会大大减少:

      if (*all right*):
          return s.replace(removetext, 'good')
      return s
      

      最后,我想表明您可以使用split解决此问题。但它似乎不是更好的解决方案。

      def not_bad( s ):
          q = s.split( "bad" )
          w = q[0].split( "not" )
          if len(q) > 1 < len(w):
              return w[0] + "good" + "bad".join(q[1:])
          return s
      

答案 2 :(得分:1)

既然你正在努力学习,我不想给你答案,但我会先从python文档中查找一些字符串函数,包括replace和index。

此外,如果您有一个好的IDE,它可以通过向您显示附加到对象的方法甚至自动显示这些方法的帮助字符串来提供帮助。我倾向于将Eclipse用于大型项目,而将Spyder用于小型项目

答案 3 :(得分:1)

http://docs.python.org/library/stdtypes.html#string-methods

我怀疑他们希望你使用string.find来定位各种子串:

>>> mystr = "abcd"
>>> mystr.find("bc")
1
>>> mystr.find("bce")
-1

既然你正在尝试自学(kudos,BTW :)我不会发布一个完整的解决方案,但是请注意你可以使用索引来获得子串:

>>> mystr[0:mystr.find("bc")]
'a'

希望这足以让你入门!如果没有,请在这里发表评论,我可以发布更多内容。 :)

答案 4 :(得分:0)

def not_bad(s):
    snot = s.find("not")
    sbad = s.find("bad")
    if snot < sbad:
        s = s.replace(s[snot:(sbad+3)], "good")
        return s
    else:
        return s