按索引

时间:2016-05-03 21:22:12

标签: python string indexing slice

我有一个看起来像这样的字符串:

((id = id_2) AND (condition1 = condition2))

我想要的是获取以第一个')'结尾的字符串,然后向后关联'('。然后我使用该字符串并用其他东西替换它。这样我可以重复操作直到我得到没有'('或')'的字符串。 到目前为止,我的代码是这样的:

original_string = '((id = id_2) AND (condition1 = condition2))'
while ')' in original_string:
    needed_string = original_string[original_string.index(')'):original_string.index('('):-1][::-1]
    original_string.replace(needed_string, 'False')

这是有效的,在第一次迭代后,我得到了我想要的东西:

needed_string = '(id = id_2)'
original_string = '(False AND (condition1 = condition2))'

但是在下一次迭代中,我得到了:

needed_string = 'False AND (condition1 = condition2)'

我想要的第二次迭代是:

needed_string = '(condition1 = condition2)'

因此,在使用replace之后,original_string看起来像这样:

original_string = '(False AND False)'

这样,在第3次迭代期间:

needed_string = '(False and False)'

并在更换后,

original_string = 'False'

我是python的新手,所以我不确定这是否正常,或者是否有更好的方法可以做到这一点,但必须以简单的方式完成(不使用任何第三方库)或标记< / p>

2 个答案:

答案 0 :(得分:3)

您可以使用regular expressions查找并替换所有需要的值。

import re
def get_groups(expr, replace):
    pattern = re.compile(r'\([^()]*\)')
    while True:
        m = pattern.search(expr)
        if m is None:
            break
        expr = expr[:m.start()] + replace + expr[m.end():]
        yield (m.group(), expr)

并使用此方法:

>>> expr = '((id = id_2) AND (condition1 = condition2))'
>>> for needed_string, original_string in get_groups(expr, 'False'):
        print('needed string   =', repr(needed_string))
        print('original string =', repr(original_string))
        print()

needed string   = '(id = id_2)'
original string = '(False AND (condition1 = condition2))'

needed string   = '(condition1 = condition2)'
original string = '(False AND False)'

needed string   = '(False AND False)'
original string = 'False'

答案 1 :(得分:3)

您的方法存在的问题是您发现第一个左括号而不是您之前找到的相应的左括号。

要解决此问题,您可以将正则表达式用作Kupiakos suggested,也可以尝试使用str.rfind方法

  def replace_first_expression(string, replacement):
      close_parenthesis_pos = string.find(')')
      if close_parenthesis_pos == -1:
          return string
      open_parenthesis_pos = string.rfind('(', 0, close_parenthesis_pos)
      if open_parenthesis_pos == -1:
          return string
      return string[:open_parenthesis_pos] + replacement + string[close_parenthesis_pos + 1:]