Заменить символ только тогда, когда символ не в скобках - PullRequest
0 голосов
/ 28 января 2019

У меня есть строка, подобная следующей:

test_string = "test:(apple:orange,(orange:apple)):test2"

Я хочу заменить ":" на "/", только если она не содержится ни в одном наборе скобок.

желаемый результат: «test / (apple: orange, (orange: apple)) / test2»

Как это можно сделать в Python?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете использовать приведенный ниже код для достижения ожидаемого выхода

def solve(args):
    ans=''
    seen = 0
    for i in args:
        if i == '(':
            seen += 1
        elif i== ')':
            seen -= 1
        if i == ':' and seen <= 0:
            ans += '/'
        else:
            ans += i
    return ans

test_string = "test:(apple:orange,(orange:apple)):test2"
print(solve(test_string))
0 голосов
/ 28 января 2019

С регулярным выражением модулем:

>>> import regex
>>> test_string = "test:(apple:orange,(orange:apple)):test2"
>>> regex.sub(r'\((?:[^()]++|(?0))++\)(*SKIP)(*F)|:', '/', test_string)
'test/(apple:orange,(orange:apple))/test2'
0 голосов
/ 28 января 2019
  1. Найти первые открывающие скобки
  2. Найти последние закрывающие скобки
  3. Заменить все ":" на "/" перед первыми открывающими скобками
  4. Не 'ничего не делать с средней частью
  5. Заменить каждое ":" на "/" после последних закрывающих скобок
  6. Сложить эти 3 подстроки вместе

Код:

test_string = "test:(apple:orange,(orange:apple)):test2"
first_opening = test_string.find('(')
last_closing = test_string.rfind(')')
result_string = test_string[:first_opening].replace(':', '/') + test_string[first_opening : last_closing] +  test_string[last_closing:].replace(':', '/')
print(result_string)

Вывод:

test/(apple:orange,(orange:apple))/test2

Предупреждение: как указано в комментариях, это не будет работать, если есть несколько различных круглых скобок: (*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...