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