【问题标题】:Slicing strings backwards by index按索引向后切片字符串
【发布时间】:2016-08-29 02:46:11
【问题描述】:

我有一个如下所示的字符串:

((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)'

所以在我使用替换后,original_string 看起来像这样:

original_string = '(False AND False)'

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

needed_string = '(False and False)'

替换后,

original_string = 'False'

我是 python 新手,所以我不确定这是否可行,或者是否有更好的方法可以做到这一点,但必须以简单的方式(不使用任何 3rd 方库)或标记化

【问题讨论】:

  • 忘了提到它必须在不使用任何 3rd 方库的情况下完成
  • 请编辑您的问题,为每次迭代提供所需的输出,以便我们知道您的代码是如何工作的。
  • 完成。我希望它现在更容易理解。
  • 根据您的语法,您可能应该以某种方式进行标记。

标签: python string indexing slice


【解决方案1】:

你的方法的问题是你发现 first 左括号不是你之前找到的右括号对应的那个。

要解决这个问题你可以使用正则表达式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:]

【讨论】:

    【解决方案2】:

    您可以使用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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 2015-10-05
      • 1970-01-01
      • 2022-01-16
      • 2023-03-27
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多