I am trying to use this regular expression to remove all instances of square brackets (and everything in them) from strings. For example, this works when there is only one p
By default * (or +) matches greedily, so the pattern given in the question will match upto the last ].
>>> re.findall(r'\[[^()]*\]', "Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]")
['[a] donkey lying down among the sheep pens.[b]']
By appending ? after the repetition operator (*), you can make it match non-greedy way.
>>> import re
>>> pattern = r'\[.*?\]'
>>> s = """Issachar is a rawboned[a] donkey lying down among the sheep pens.[b]"""
>>> re.sub(pattern, '', s)
'Issachar is a rawboned donkey lying down among the sheep pens.'