You can use re
to achieve the desired result.
I've used two patterns and different string scenarios and their behavior.
You can see the limitations we can have and chose whichever suits your purpose the best.
You could use something like this :
import re
str1 = "[AnyTextOrNumber]AnyTextOrNumber#AnyNumber"
str2 = "[AnyTextOrNumber]AnyTextOrNumber#AnyNumber[MoreTextOrNumber]"
str3 = "[AnyTextOr]Number]AnyTextOrNumber#AnyNumber"
str4 = "[AnyTextOr]Number]AnyTextOrNumber#AnyNumber[MoreTextOrNumber]"
pattern1 = r'\[[^()]*\]'
pattern2 = r'\[.*?\]'
convPattern1_str1 = re.sub(pattern1, '', str1)
convPattern1_str2 = re.sub(pattern1, '', str2)
convPattern1_str3 = re.sub(pattern1, '', str3)
convPattern1_str4 = re.sub(pattern1, '', str4)
convPattern2_str1 = re.sub(pattern2, '', str1)
convPattern2_str2 = re.sub(pattern2, '', str2)
convPattern2_str3 = re.sub(pattern2, '', str3)
convPattern2_str4 = re.sub(pattern2, '', str4)
print(convPattern1_str1) #Will give AnyTextOrNumber#AnyNumber
print(convPattern1_str2) #Will remove everything
print(convPattern1_str3) #Will give AnyTextOrNumber#AnyNumber
print(convPattern1_str4) #Will remove everything
print(convPattern2_str1) #Will give AnyTextOrNumber#AnyNumber
print(convPattern2_str2) #Will give AnyTextOrNumber#AnyNumber
print(convPattern2_str3) #Will give Number]AnyTextOrNumber#AnyNumber
print(convPattern2_str4) ##Will give Number]AnyTextOrNumber#AnyNumber