In this article, we will learn how to swap Name and Date for each item in a list using Group Capturing and Numeric Back-referencing feature in Regex .
Capturing Group : Parentheses groups the regex between them and captures the text matched by the regex inside them into a numbered group i.e ([\w ]+) which can be reused with a numbered back-reference i.e
\g<Group Number> |
We are given a list where each item is a string containing the name of a book followed by it’s release year.
We have to swap the Name and Date for each item in the list using Capturing group in Regex and display the output in a chronological order. Let us consider a few examples:
Examples:
Input : Name (Date) Output : Date - Name Input : City of Glass (2009) Output : 2009 - City of Glass Input : Pride and Prejudice (1813) Output : 1813 - Pride and Prejudice
Note: In the output, the date is not enclosed between parenthesis and there is a dash between Date and Name.
Regex_Pattern : ([\w ]+) \((\d{4})\)
Explanation :
- The parenthesis in the above pattern groups the regex between them. ([\w ]+) is the first group capturing Name which is back-referenced by
\g<
1
>
- (\d{4}) is the second group capturing Date which is back-referenced by
\g<
2
>
for each string.
- We use .sub() to replace the leftmost non-overlapping occurrences of regex_pattern in the string by the new replacement .
.subl(\g<
2
>
-
\g<
1
>,string)
- Once the Name and Date are swapped, the new string is appended to the new list.
- The new list is then sorted and we traverse through the new list and print each item in it.
Code : Python3 program to swap Name and Date for each item in the list using Regex
# Python3 program to swap Name and Date for each item # in the list using Regex # sort the list after swapping to display the output # in a chronological order #Importing re package import re def swap_name_date(books = []): # new empty list to store swapped data ordered_book_list = [] # RegexObject = re.compile( Regular expression, flag ) # Compiles a regular expression pattern into a regular expression object regex_pattern = re. compile (r '([\w ]+) \((\d{4})\)' ) # Iterating through each item in unordered_books_list # and swapping group 2 of date with group 1 of name for book in books: # Result after swapping is stored in res res = regex_pattern.sub( '\g<2> - \g<1>' ,book) # res is appended to ordered_book_list ordered_book_list.append(res) # After all items of unordered_books_list are swapped # and appended to ordered_book_list # ordered_book_list is sorted ordered_book_list.sort() # Iterating through each item of ordered_book_list and printing it for book in ordered_book_list: print (book) # Driver Code if __name__ = = "__main__" : #unordered_books_list stores data to be swapped unordered_books_list = [ "City of Glass (2009)" , "The Great Gatsby (1925)" , "Pride and Prejudice (1813)" , "The Hunger Games (2008)" , "To Kill a Mockingbird (1960)" , "The Notebook (1996)" , "Jane Eyre (1847)" , "The Catcher in the Rye (1951)" , "The Lord of the Rings (1954)" , "All the light We Cannot See (2014)" , "Immortals of Meluha (2010)" ] swap_name_date(unordered_books_list) |
Output:
1813 - Pride and Prejudice 1847 - Jane Eyre 1925 - The Great Gatsby 1951 - The Catcher in the Rye 1954 - The Lord of the Rings 1960 - To Kill a Mockingbird 1996 - The Notebook 2008 - The Hunger Games 2009 - City of Glass 2010 - Immortals of Meluha 2014 - All the light We Cannot See