У меня есть куча таких строк:
abc#axyz(abc#axyz#a#aabc)abc#axyz
. Что мне нужно сделать, так это удалить все #a
, которые появляются в тексте между скобками, а те, что снаружи, должны остаться. Я пробовал следующее:
\((.*?)(#a)(.*?)\)
Но он ловит только первое повторение. Что я делаю не так? Спасибо за любой вклад!
Попробуйте (ссылка 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)
@dawg Да, возможно. Зависит от того, насколько в целом различаются их строки (например, принятый ответ также предполагает, что есть только одна пара скобок). Мне нравится все упрощать, если только у меня нет веских причин не делать этого. Я здесь не определился.
Вы также можете использовать этот метод:
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)
r'\([^)]*\)'
, вероятно, лучший образец. Не беспокойтесь о жадности или новых строках... Хотя от меня +1.