倒序按索引分割字符串

3

我有一个字符串,长这样:

((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的新手,所以我不确定这是否可以,或者是否有更好的方法来完成这个任务,但必须以简单的方式完成(不使用任何第三方库)或进行分词处理。


如果您懒得自己动手,可以参考 https://sexpdata.readthedocs.io/en/latest/。 - enedil
忘了提到,必须在不使用任何第三方库的情况下完成。 - Christian Ackermann
1
请编辑您的问题,为每个迭代提供所需的输出,以便我们知道您的代码预期如何工作。 - manglano
完成。希望现在更容易理解了。 - Christian Ackermann
根据你的语法,你应该以某种方式进行标记化。 - Alyssa Haroldsen
2个回答

3

您可以使用正则表达式来查找和替换所有需要的值。

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'

3
你的方法存在问题,因为你只找到了左括号中的第一个,而不是之前找到的相应右括号所匹配的左括号。
为解决此问题,你可以使用正则表达式,如Kupiakos建议的,或尝试使用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:]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接