A Regular Expressions (RegEx) is a special sequence of characters that uses a search pattern to find a string or set of strings. It can detect the presence or absence of a text by matching it with a particular pattern, and also can split a pattern into one or more sub-patterns. Python provides a re module that supports the use of regex in Python. Its primary function is to offer a search, where it takes a regular expression and a string. Here, it either returns the first match or else none.
Example:
Python3
import re s = 'Lazyroar: A computer science portal for Lazyroar' match = re.search(r 'portal' , s) print ( 'Start Index:' , match.start()) print ( 'End Index:' , match.end()) |
Start Index: 34 End Index: 40
The above code gives the starting index and the ending index of the string portal.
Note: Here r character (r’portal’) stands for raw, not regex. The raw string is slightly different from a regular string, it won’t interpret the \ character as an escape character. This is because the regular expression engine uses \ character for its own escaping purpose.
Before starting with the Python regex module let’s see how to actually write regex using metacharacters or special sequences.
MetaCharacters
To understand the RE analogy, MetaCharacters are useful, important, and will be used in functions of module re. Below is the list of metacharacters.
MetaCharacters |
Description |
---|---|
\ |
Used to drop the special meaning of character following it |
[] |
Represent a character class |
^ |
Matches the beginning |
$ |
Matches the end |
. |
Matches any character except newline |
| |
Means OR (Matches with any of the characters separated by it. |
? |
Matches zero or one occurrence |
* |
Any number of occurrences (including 0 occurrences) |
+ |
One or more occurrences |
{} |
Indicate the number of occurrences of a preceding regex to match. |
() |
Enclose a group of Regex |
Let’s discuss each of these metacharacters in detail
\ – Backslash
The backslash (\) makes sure that the character is not treated in a special way. This can be considered a way of escaping metacharacters. For example, if you want to search for the dot(.) in the string then you will find that dot(.) will be treated as a special character as is one of the metacharacters (as shown in the above table). So for this case, we will use the backslash(\) just before the dot(.) so that it will lose its specialty. See the below example for a better understanding.
Example:
Python3
import re s = 'Lazyroar.forLazyroar' # without using \ match = re.search(r '.' , s) print (match) # using \ match = re.search(r '\.' , s) print (match) |
<re.Match object; span=(0, 1), match='g'> <re.Match object; span=(5, 6), match='.'>
[] – Square Brackets
Square Brackets ([]) represent a character class consisting of a set of characters that we wish to match. For example, the character class [abc] will match any single a, b, or c.
We can also specify a range of characters using – inside the square brackets. For example,
- [0, 3] is sample as [0123]
- [a-c] is same as [abc]
We can also invert the character class using the caret(^) symbol. For example,
- [^0-3] means any number except 0, 1, 2, or 3
- [^a-c] means any character except a, b, or c
Example:
Python3
import re string = "The quick brown fox jumps over the lazy dog" pattern = "[a-m]" result = re.findall(pattern, string) print (result) |
['h', 'e', 'i', 'c', 'k', 'b', 'f', 'j', 'm', 'e', 'h', 'e', 'l', 'a', 'd', 'g']
^ – Caret
Caret (^) symbol matches the beginning of the string i.e. checks whether the string starts with the given character(s) or not. For example –
- ^g will check if the string starts with g such as Lazyroar, globe, girl, g, etc.
- ^ge will check if the string starts with ge such as Lazyroar, neveropen, etc.
Example:
Python3
import re # Match strings starting with "The" regex = r '^The' strings = [ 'The quick brown fox' , 'The lazy dog' , 'A quick brown fox' ] for string in strings: if re.match(regex, string): print (f 'Matched: {string}' ) else : print (f 'Not matched: {string}' ) |
Matched: The quick brown fox Matched: The lazy dog Not matched: A quick brown fox
$ – Dollar
Dollar($) symbol matches the end of the string i.e checks whether the string ends with the given character(s) or not. For example –
- s$ will check for the string that ends with a such as Lazyroar, ends, s, etc.
- ks$ will check for the string that ends with ks such as Lazyroar, neveropen, ks, etc.
Example:
Python3
import re string = "Hello World!" pattern = r "World!$" match = re.search(pattern, string) if match: print ( "Match found!" ) else : print ( "Match not found." ) |
Match found!
. – Dot
Dot(.) symbol matches only a single character except for the newline character (\n). For example –
- a.b will check for the string that contains any character at the place of the dot such as acb, acbd, abbb, etc
- .. will check if the string contains at least 2 characters
Example:
Python3
import re string = "The quick brown fox jumps over the lazy dog." pattern = r "brown.fox" match = re.search(pattern, string) if match: print ( "Match found!" ) else : print ( "Match not found." ) |
Match found!
| – Or
Or symbol works as the or operator meaning it checks whether the pattern before or after the or symbol is present in the string or not. For example –
- a|b will match any string that contains a or b such as acd, bcd, abcd, etc.
? – Question Mark
The question mark (?) is a quantifier in regular expressions that indicates that the preceding element should be matched zero or one time. It allows you to specify that the element is optional, meaning it may occur once or not at all. For example,
- ab?c will be matched for the string ac, acb, dabc but will not be matched for abbc because there are two b. Similarly, it will not be matched for abdc because b is not followed by c.
* – Star
Star (*) symbol matches zero or more occurrences of the regex preceding the * symbol. For example –
- ab*c will be matched for the string ac, abc, abbbc, dabc, etc. but will not be matched for abdc because b is not followed by c.
+ – Plus
Plus (+) symbol matches one or more occurrences of the regex preceding the + symbol. For example –
- ab+c will be matched for the string abc, abbc, dabc, but will not be matched for ac, abdc, because there is no b in ac and b, is not followed by c in abdc.
{m, n} – Braces
Braces match any repetitions preceding regex from m to n both inclusive. For example –
- a{2, 4} will be matched for the string aaab, baaaac, gaad, but will not be matched for strings like abc, bc because there is only one a or no a in both the cases.
(<regex>) – Group
Group symbol is used to group sub-patterns. For example –
- (a|b)cd will match for strings like acd, abcd, gacd, etc.
Special Sequences
Special sequences do not match for the actual character in the string instead it tells the specific location in the search string where the match must occur. It makes it easier to write commonly used patterns.
List of special sequences
Special Sequence |
Description |
Examples |
|
---|---|---|---|
\A |
Matches if the string begins with the given character |
\Afor |
for Lazyroar |
for the world |
|||
\b |
Matches if the word begins or ends with the given character. \b(string) will check for the beginning of the word and (string)\b will check for the ending of the word. |
\bge |
Lazyroar |
get |
|||
\B |
It is the opposite of the \b i.e. the string should not start or end with the given regex. |
\Bge |
together |
forge |
|||
\d |
Matches any decimal digit, this is equivalent to the set class [0-9] |
\d |
123 |
gee1 |
|||
\D |
Matches any non-digit character, this is equivalent to the set class [^0-9] |
\D |
Lazyroar |
geek1 |
|||
\s |
Matches any whitespace character. |
\s |
gee ks |
a bc a |
|||
\S |
Matches any non-whitespace character |
\S |
a bd |
abcd |
|||
\w |
Matches any alphanumeric character, this is equivalent to the class [a-zA-Z0-9_]. |
\w |
123 |
geeKs4 |
|||
\W |
Matches any non-alphanumeric character. |
\W |
>$ |
gee<> |
|||
\Z |
Matches if the string ends with the given regex |
ab\Z |
abcdab |
abababab |
Regex Module in Python
Python has a module named re that is used for regular expressions in Python. We can import this module by using the import statement.
Example: Importing re module in Python
Python3
import re |
Let’s see various functions provided by this module to work with regex in Python.
re.findall()
Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found.
Example: Finding all occurrences of a pattern
Python3
# A Python program to demonstrate working of # findall() import re # A sample text string where regular expression # is searched. string = """Hello my Number is 123456789 and my friend's number is 987654321""" # A sample regular expression to find digits. regex = '\d+' match = re.findall(regex, string) print (match) # This example is contributed by Ayush Saluja. |
['123456789', '987654321']
re.compile()
Regular expressions are compiled into pattern objects, which have methods for various operations such as searching for pattern matches or performing string substitutions.
Example 1:
Python
# Module Regular Expression is imported # using __import__(). import re # compile() creates regular expression # character class [a-e], # which is equivalent to [abcde]. # class [abcde] will match with string with # 'a', 'b', 'c', 'd', 'e'. p = re. compile ( '[a-e]' ) # findall() searches for the Regular Expression # and return a list upon finding print (p.findall( "Aye, said Mr. Gibenson Stark" )) |
['e', 'a', 'd', 'b', 'e', 'a']
Output:
['e', 'a', 'd', 'b', 'e', 'a']
Understanding the Output:
- First occurrence is ‘e’ in “Aye” and not ‘A’, as it is Case Sensitive.
- Next Occurrence is ‘a’ in “said”, then ‘d’ in “said”, followed by ‘b’ and ‘e’ in “Gibenson”, the Last ‘a’ matches with “Stark”.
- Metacharacter backslash ‘\’ has a very important role as it signals various sequences. If the backslash is to be used without its special meaning as metacharacter, use’\\’
Example 2: Set class [\s,.] will match any whitespace character, ‘,’, or, ‘.’ .
Python
import re # \d is equivalent to [0-9]. p = re. compile ( '\d' ) print (p.findall( "I went to him at 11 A.M. on 4th July 1886" )) # \d+ will match a group on [0-9], group # of one or greater size p = re. compile ( '\d+' ) print (p.findall( "I went to him at 11 A.M. on 4th July 1886" )) |
['1', '1', '4', '1', '8', '8', '6'] ['11', '4', '1886']
Output:
['1', '1', '4', '1', '8', '8', '6']
['11', '4', '1886']
Example 3:
Python
import re # \w is equivalent to [a-zA-Z0-9_]. p = re. compile ( '\w' ) print (p.findall( "He said * in some_lang." )) # \w+ matches to group of alphanumeric character. p = re. compile ( '\w+' ) print (p.findall("I went to him at 11 A.M., he \ said * * * in some_language.")) # \W matches to non alphanumeric characters. p = re. compile ( '\W' ) print (p.findall( "he said *** in some_language." )) |
['H', 'e', 's', 'a', 'i', 'd', 'i', 'n', 's', 'o', 'm', 'e', '_', 'l', 'a', 'n', 'g'] ['I', 'went', 'to', 'him', 'at', '11', 'A', 'M', 'he', 'said', 'in', 'some_language'] [' ', ' ', '*', '*', '*', ' ', ' ', '.']
Output:
['H', 'e', 's', 'a', 'i', 'd', 'i', 'n', 's', 'o', 'm', 'e', '_', 'l', 'a', 'n', 'g']
['I', 'went', 'to', 'him', 'at', '11', 'A', 'M', 'he', 'said', 'in', 'some_language']
[' ', ' ', '*', '*', '*', ' ', ' ', '.']
Example 4:
Python
import re # '*' replaces the no. of occurrence # of a character. p = re. compile ( 'ab*' ) print (p.findall( "ababbaabbb" )) |
['ab', 'abb', 'a', 'abbb']
Output:
['ab', 'abb', 'a', 'abbb']
Understanding the Output:
- Our RE is ab*, which ‘a’ accompanied by any no. of ‘b’s, starting from 0.
- Output ‘ab’, is valid because of single ‘a’ accompanied by single ‘b’.
- Output ‘abb’, is valid because of single ‘a’ accompanied by 2 ‘b’.
- Output ‘a’, is valid because of single ‘a’ accompanied by 0 ‘b’.
- Output ‘abbb’, is valid because of single ‘a’ accompanied by 3 ‘b’.
re.split()
Split string by the occurrences of a character or a pattern, upon finding that pattern, the remaining characters from the string are returned as part of the resulting list.
Syntax :
re.split(pattern, string, maxsplit=0, flags=0)
The First parameter, pattern denotes the regular expression, string is the given string in which pattern will be searched for and in which splitting occurs, maxsplit if not provided is considered to be zero ‘0’, and if any nonzero value is provided, then at most that many splits occur. If maxsplit = 1, then the string will split once only, resulting in a list of length 2. The flags are very useful and can help to shorten code, they are not necessary parameters, eg: flags = re.IGNORECASE, in this split, the case, i.e. the lowercase or the uppercase will be ignored.
Example 1:
Python
from re import split # '\W+' denotes Non-Alphanumeric Characters # or group of characters Upon finding ',' # or whitespace ' ', the split(), splits the # string from that point print (split( '\W+' , 'Words, words , Words' )) print (split( '\W+' , "Word's words Words" )) # Here ':', ' ' ,',' are not AlphaNumeric thus, # the point where splitting occurs print (split( '\W+' , 'On 12th Jan 2016, at 11:02 AM' )) # '\d+' denotes Numeric Characters or group of # characters Splitting occurs at '12', '2016', # '11', '02' only print (split( '\d+' , 'On 12th Jan 2016, at 11:02 AM' )) |
['Words', 'words', 'Words'] ['Word', 's', 'words', 'Words'] ['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM'] ['On ', 'th Jan ', ', at ', ':', ' AM']
Output:
['Words', 'words', 'Words']
['Word', 's', 'words', 'Words']
['On', '12th', 'Jan', '2016', 'at', '11', '02', 'AM']
['On ', 'th Jan ', ', at ', ':', ' AM']
Example 2:
Python
import re # Splitting will occurs only once, at # '12', returned list will have length 2 print (re.split( '\d+' , 'On 12th Jan 2016, at 11:02 AM' , 1 )) # 'Boy' and 'boy' will be treated same when # flags = re.IGNORECASE print (re.split( '[a-f]+' , 'Aey, Boy oh boy, come here' , flags = re.IGNORECASE)) print (re.split( '[a-f]+' , 'Aey, Boy oh boy, come here' )) |
['On ', 'th Jan 2016, at 11:02 AM'] ['', 'y, ', 'oy oh ', 'oy, ', 'om', ' h', 'r', ''] ['A', 'y, Boy oh ', 'oy, ', 'om', ' h', 'r', '']
Output:
['On ', 'th Jan 2016, at 11:02 AM']
['', 'y, ', 'oy oh ', 'oy, ', 'om', ' h', 'r', '']
['A', 'y, Boy oh ', 'oy, ', 'om', ' h', 'r', '']
re.sub()
The ‘sub’ in the function stands for SubString, a certain regular expression pattern is searched in the given string(3rd parameter), and upon finding the substring pattern is replaced by repl(2nd parameter), count checks and maintains the number of times this occurs.
Syntax:
re.sub(pattern, repl, string, count=0, flags=0)
Example 1:
Python
import re # Regular Expression pattern 'ub' matches the # string at "Subject" and "Uber". As the CASE # has been ignored, using Flag, 'ub' should # match twice with the string Upon matching, # 'ub' is replaced by '~*' in "Subject", and # in "Uber", 'Ub' is replaced. print (re.sub( 'ub' , '~*' , 'Subject has Uber booked already' , flags = re.IGNORECASE)) # Consider the Case Sensitivity, 'Ub' in # "Uber", will not be replaced. print (re.sub( 'ub' , '~*' , 'Subject has Uber booked already' )) # As count has been given value 1, the maximum # times replacement occurs is 1 print (re.sub( 'ub' , '~*' , 'Subject has Uber booked already' , count = 1 , flags = re.IGNORECASE)) # 'r' before the pattern denotes RE, \s is for # start and end of a String. print (re.sub(r '\sAND\s' , ' & ' , 'Baked Beans And Spam' , flags = re.IGNORECASE)) |
S~*ject has ~*er booked already S~*ject has Uber booked already S~*ject has Uber booked already Baked Beans & Spam
Output
S~*ject has ~*er booked already
S~*ject has Uber booked already
S~*ject has Uber booked already
Baked Beans & Spam
re.subn()
subn() is similar to sub() in all ways, except in its way of providing output. It returns a tuple with a count of the total of replacement and the new string rather than just the string.
Syntax:
re.subn(pattern, repl, string, count=0, flags=0)
Example:
Python
import re print (re.subn( 'ub' , '~*' , 'Subject has Uber booked already' )) t = re.subn( 'ub' , '~*' , 'Subject has Uber booked already' , flags = re.IGNORECASE) print (t) print ( len (t)) # This will give same output as sub() would have print (t[ 0 ]) |
('S~*ject has Uber booked already', 1) ('S~*ject has ~*er booked already', 2) 2 S~*ject has ~*er booked already
Output
('S~*ject has Uber booked already', 1)
('S~*ject has ~*er booked already', 2)
Length of Tuple is: 2
S~*ject has ~*er booked already
re.escape()
Returns string with all non-alphanumerics backslashed, this is useful if you want to match an arbitrary literal string that may have regular expression metacharacters in it.
Syntax:
re.escape(string)
Example:
Python
import re # escape() returns a string with BackSlash '\', # before every Non-Alphanumeric Character # In 1st case only ' ', is not alphanumeric # In 2nd case, ' ', caret '^', '-', '[]', '\' # are not alphanumeric print (re.escape( "This is Awesome even 1 AM" )) print (re.escape( "I Asked what is this [a-9], he said \t ^WoW" )) |
This\ is\ Awesome\ even\ 1\ AM I\ Asked\ what\ is\ this\ \[a\-9\]\,\ he\ said\ \ \ \^WoW
re.search()
This method either returns None (if the pattern doesn’t match), or a re.MatchObject contains information about the matching part of the string. This method stops after the first match, so this is best suited for testing a regular expression more than extracting data.
Example: Searching for an occurrence of the pattern
Python3
# A Python program to demonstrate working of re.match(). import re # Lets use a regular expression to match a date string # in the form of Month name followed by day number regex = r "([a-zA-Z]+) (\d+)" match = re.search(regex, "I was born on June 24" ) if match ! = None : # We reach here when the expression "([a-zA-Z]+) (\d+)" # matches the date string. # This will print [14, 21), since it matches at index 14 # and ends at 21. print ( "Match at index %s, %s" % (match.start(), match.end())) # We use group() method to get all the matches and # captured groups. The groups contain the matched values. # In particular: # match.group(0) always returns the fully matched string # match.group(1) match.group(2), ... return the capture # groups in order from left to right in the input string # match.group() is equivalent to match.group(0) # So this will print "June 24" print ( "Full match: %s" % (match.group( 0 ))) # So this will print "June" print ( "Month: %s" % (match.group( 1 ))) # So this will print "24" print ( "Day: %s" % (match.group( 2 ))) else : print ( "The regex pattern does not match." ) |
Match at index 14, 21 Full match: June 24 Month: June Day: 24
Match Object
A Match object contains all the information about the search and the result and if there is no match found then None will be returned. Let’s see some of the commonly used methods and attributes of the match object.
Getting the string and the regex
match.re attribute returns the regular expression passed and match.string attribute returns the string passed.
Example: Getting the string and the regex of the matched object
Python3
import re s = "Welcome to GeeksForGeeks" # here x is the match object res = re.search(r "\bG" , s) print (res.re) print (res.string) |
re.compile('\\bG') Welcome to GeeksForGeeks
Getting index of matched object
- start() method returns the starting index of the matched substring
- end() method returns the ending index of the matched substring
- span() method returns a tuple containing the starting and the ending index of the matched substring
Example: Getting index of matched object
Python3
import re s = "Welcome to GeeksForGeeks" # here x is the match object res = re.search(r "\bGee" , s) print (res.start()) print (res.end()) print (res.span()) |
11 14 (11, 14)
Getting matched substring
group() method returns the part of the string for which the patterns match. See the below example for a better understanding.
Example: Getting matched substring
Python3
import re s = "Welcome to GeeksForGeeks" # here x is the match object res = re.search(r "\D{2} t" , s) print (res.group()) |
me t
In the above example, our pattern specifies for the string that contains at least 2 characters which are followed by a space, and that space is followed by a t.
Related Article :
https://www.geeksforgeeks.org/regular-expressions-python-set-1-search-match-find/
Reference:
https://docs.python.org/2/library/re.html
This article is contributed by Piyush Doorwar. If you like Lazyroar and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the Lazyroar main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.