Как уловить повторяющийся шаблон с помощью регулярного выражения в строке?

У меня есть куча таких строк: abc#axyz(abc#axyz#a#aabc)abc#axyz. Что мне нужно сделать, так это удалить все #a, которые появляются в тексте между скобками, а те, что снаружи, должны остаться. Я пробовал следующее:

\((.*?)(#a)(.*?)\)

Но он ловит только первое повторение. Что я делаю не так? Спасибо за любой вклад!

🤔 А знаете ли вы, что...
Python является интерпретируемым языком программирования.


2
56
3

Ответы:

Решено

Попробуйте (ссылка regex101):

import re

s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"

out = re.sub(r"#a(?=.*\))(?!.*\()", "", s)
print(out)

Распечатки:

abc#axyz(abcxyzabc)abc#axyz

Я мог бы просто найти часть в скобках, а затем выполнить замену как отдельный шаг.

import re

s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"

out = re.sub(r'\(.*\)', lambda m: m[0].replace('#a', ''), s)
print(out)

Попробуйте это онлайн!


Вы также можете использовать этот метод:

import re

s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"

out = re.sub(r'\(([^)]*)\)', lambda m: '(' + m.group(1).replace('#a', '') + ')', s)
print(out)