Sometimes, while working with Python strings, we can have a problem in which we need to extract the substrings between certain characters that can be bracketed. This can have application in cases we have tuples embedded in string. Let’s discuss certain ways in which this task can be performed.
Method #1: Using regex
One way to solve this problem is by using regex. In this we employ suitable regex and perform the task of extraction of required elements.
Python3
import re
test_str = "geeks(for)geeks is (best)"
print ( "The original string is : " + test_str)
res = re.findall(r '\(.*?\)' , test_str)
print ( "The element between brackets : " + str (res))
|
Output :
The original string is : geeks(for)geeks is (best)
The element between brackets : ['(for)', '(best)']
Time complexity: O(n), where n is the length of the input string test_str.
Auxiliary space: O(m), where m is the number of matches of the pattern r’\(.*?\)’ in the input string test_str. The reason is that the function re.findall() creates a list res of all matches, so the space needed is proportional to the number of matches.
Method #2 : Using list comprehension + isinstance() + eval()
The combination of the above methods can also be used to solve this problem. In this eval() assume the brackets to be tuples and helps the extraction of strings within them.
Python3
test_str = "[(234, ), 4, (432, )]"
print ( "The original string is : " + test_str)
res = [ str (idx) for idx in eval (test_str) if isinstance (idx, tuple )]
print ( "The element between brackets : " + str (res))
|
Output :
The original string is : [(234, ), 4, (432, )]
The element between brackets : ['(234, )', '(432, )']
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #3 : Using replace(),split(),startswith(),endswith() methods
Python3
test_str = "[(234, ), 4, (432, )]"
print ( "The original string is : " + test_str)
test_str = test_str.replace( "(" , "*(" )
test_str = test_str.replace( ")" , ")*" )
x = test_str.split( "*" )
res = []
for i in x:
if i.startswith( "(" ) and i.endswith( ")" ):
res.append(i)
print ( "The element between brackets : " + str (res))
|
Output
The original string is : [(234, ), 4, (432, )]
The element between brackets : ['(234, )', '(432, )']
Time Complexity: O(n)
Auxiliary Space: O(n)
Method #4: Using a loop and conditional statements
Step-by-step approach:
- Initialize an empty list called substrings.
- Initialize a boolean variable called in_brackets to False.
- Initialize an empty string called current_substring.
- Loop through each character in the string test_str.
- If the current character is an opening bracket (set in_brackets to True.
- If the current character is a closing bracket ) and in_brackets is True, append current_substring to substrings and set current_substring to an empty string. Set in_brackets to False.
- If in_brackets is True, add the current character to current_substring.
- After the loop is finished, if current_substring is not empty, append it to substrings.
- Print substrings.
Python3
test_str = "geeks(for)geeks is (best)"
print ( "The original string is : " + test_str)
substrings = []
in_brackets = False
current_substring = ""
for c in test_str:
if c = = "(" :
in_brackets = True
elif c = = ")" and in_brackets:
substrings.append(current_substring)
current_substring = ""
in_brackets = False
elif in_brackets:
current_substring + = c
if current_substring:
substrings.append(current_substring)
print ( "The element between brackets : " + str (substrings))
|
Output
The original string is : geeks(for)geeks is (best)
The element between brackets : ['for', 'best']
Time complexity: O(n), where n is the length of test_str.
Auxiliary space: O(m), where m is the number of substrings between brackets in test_str.
Method #6: Using split() and join() methods
Step-by-step approach:
- Split the input string into a list of substrings using the split() method and the delimiter “(“.
- Create a new list to store the substrings between the parentheses.
- Iterate over the list of substrings and split each one using the “)” delimiter.
- If the resulting list has more than one element, append the second element to the list of substrings between parentheses.
- Join the list of substrings between parentheses into a string using the join() method.
- Print the list of substrings between parentheses.
Below is the implementation of the above approach:
Python3
test_str = "geeks(for)geeks is (best)"
print ( "The original string is : " + test_str)
substrings = []
split_str = test_str.split( "(" )
for s in split_str[ 1 :]:
split_s = s.split( ")" )
if len (split_s) > 1 :
substrings.append(split_s[ 0 ])
substrings_str = ", " .join(substrings)
print ( "The element between brackets : " + substrings_str)
|
Output
The original string is : geeks(for)geeks is (best)
The element between brackets : for, best
Time Complexity: The time complexity of this method is O(n), where n is the length of the input string, as the split() and join() methods perform a single pass through the string.
Auxiliary Space: The auxiliary space complexity of this method is O(k), where k is the number of substrings between parentheses, as the method stores a list of these substrings.
Method #7: Using str.find() method and slicing
Step-by-step approach:
- Find the index of the first opening bracket “(” in the given string using the str.find() method.
- Find the index of the first closing bracket “)” in the given string using the str.find() method starting from the index found in step 1.
- Slice the substring between the two indices found in steps 1 and 2 using string slicing.
- Repeat steps 1-3 for all occurrences of the brackets in the string using a while loop.
- Join the list of substrings obtained in step 4 using the join() method and the desired separator.
Below is the implementation of the above approach:
Python3
test_str = "geeks(for)geeks is (best)"
print ( "The original string is : " + test_str)
substrings = []
start_index = test_str.find( "(" )
while start_index ! = - 1 :
end_index = test_str.find( ")" , start_index + 1 )
if end_index ! = - 1 :
substrings.append(test_str[start_index + 1 :end_index])
start_index = test_str.find( "(" , start_index + 1 )
substrings_str = ", " .join(substrings)
print ( "The element between brackets : " + substrings_str)
|
Output
The original string is : geeks(for)geeks is (best)
The element between brackets : for, best
Time complexity: O(n^2) (worst case when all characters are brackets)
Auxiliary space: O(n) (for storing the list of substrings)
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!
Last Updated :
29 Mar, 2023
Like Article
Save Article