- Python RegEx
- RegEx Module
- RegEx in Python
- Example
- RegEx Functions
- Metacharacters
- Special Sequences
- Sets
- The findall() Function
- Example
- Example
- The search() Function
- Example
- Example
- The split() Function
- Example
- Example
- The sub() Function
- Example
- Example
- Match Object
- Example
- Example
- Example
- Example
- How to find all matches in a regular expression
- 2 Answers 2
- Python regex find all matches
- 4 Answers 4
Python RegEx
A RegEx, or Regular Expression, is a sequence of characters that forms a search pattern.
RegEx can be used to check if a string contains the specified search pattern.
RegEx Module
Python has a built-in package called re , which can be used to work with Regular Expressions.
RegEx in Python
When you have imported the re module, you can start using regular expressions:
Example
Search the string to see if it starts with «The» and ends with «Spain»:
txt = «The rain in Spain»
x = re.search(«^The.*Spain$», txt)
RegEx Functions
The re module offers a set of functions that allows us to search a string for a match:
Function | Description |
---|---|
findall | Returns a list containing all matches |
search | Returns a Match object if there is a match anywhere in the string |
split | Returns a list where the string has been split at each match |
sub | Replaces one or many matches with a string |
Metacharacters
Metacharacters are characters with a special meaning:
Character | Description | Example | Try it |
---|---|---|---|
[] | A set of characters | «[a-m]» | Try it » |
\ | Signals a special sequence (can also be used to escape special characters) | «\d» | Try it » |
. | Any character (except newline character) | «he..o» | Try it » |
^ | Starts with | «^hello» | Try it » |
$ | Ends with | «planet$» | Try it » |
* | Zero or more occurrences | «he.*o» | Try it » |
+ | One or more occurrences | «he.+o» | Try it » |
? | Zero or one occurrences | «he.?o» | Try it » |
<> | Exactly the specified number of occurrences | «he.o» | Try it » |
| | Either or | «falls|stays» | Try it » |
() | Capture and group |
Special Sequences
A special sequence is a \ followed by one of the characters in the list below, and has a special meaning:
Character | Description | Example | Try it |
---|---|---|---|
\A | Returns a match if the specified characters are at the beginning of the string | «\AThe» | Try it » |
\b | Returns a match where the specified characters are at the beginning or at the end of a word (the «r» in the beginning is making sure that the string is being treated as a «raw string») | r»\bain» r»ain\b» | Try it » Try it » |
\B | Returns a match where the specified characters are present, but NOT at the beginning (or at the end) of a word (the «r» in the beginning is making sure that the string is being treated as a «raw string») | r»\Bain» r»ain\B» | Try it » Try it » |
\d | Returns a match where the string contains digits (numbers from 0-9) | «\d» | Try it » |
\D | Returns a match where the string DOES NOT contain digits | «\D» | Try it » |
\s | Returns a match where the string contains a white space character | «\s» | Try it » |
\S | Returns a match where the string DOES NOT contain a white space character | «\S» | Try it » |
\w | Returns a match where the string contains any word characters (characters from a to Z, digits from 0-9, and the underscore _ character) | «\w» | Try it » |
\W | Returns a match where the string DOES NOT contain any word characters | «\W» | Try it » |
\Z | Returns a match if the specified characters are at the end of the string | «Spain\Z» | Try it » |
Sets
A set is a set of characters inside a pair of square brackets [] with a special meaning:
Set | Description | Try it |
---|---|---|
[arn] | Returns a match where one of the specified characters ( a , r , or n ) is present | Try it » |
[a-n] | Returns a match for any lower case character, alphabetically between a and n | Try it » |
[^arn] | Returns a match for any character EXCEPT a , r , and n | Try it » |
[0123] | Returns a match where any of the specified digits ( 0 , 1 , 2 , or 3 ) are present | Try it » |
2 | Returns a match for any digit between 0 and 9 | Try it » |
25 | Returns a match for any two-digit numbers from 00 and 59 | Try it » |
[a-zA-Z] | Returns a match for any character alphabetically between a and z , lower case OR upper case | Try it » |
[+] | In sets, + , * , . , | , () , $ , <> has no special meaning, so [+] means: return a match for any + character in the string | Try it » |
The findall() Function
The findall() function returns a list containing all matches.
Example
Print a list of all matches:
txt = «The rain in Spain»
x = re.findall(«ai», txt)
print(x)
The list contains the matches in the order they are found.
If no matches are found, an empty list is returned:
Example
Return an empty list if no match was found:
txt = «The rain in Spain»
x = re.findall(«Portugal», txt)
print(x)
The search() Function
The search() function searches the string for a match, and returns a Match object if there is a match.
If there is more than one match, only the first occurrence of the match will be returned:
Example
Search for the first white-space character in the string:
txt = «The rain in Spain»
x = re.search(«\s», txt)
print(«The first white-space character is located in position:», x.start())
If no matches are found, the value None is returned:
Example
Make a search that returns no match:
txt = «The rain in Spain»
x = re.search(«Portugal», txt)
print(x)
The split() Function
The split() function returns a list where the string has been split at each match:
Example
Split at each white-space character:
txt = «The rain in Spain»
x = re.split(«\s», txt)
print(x)
You can control the number of occurrences by specifying the maxsplit parameter:
Example
Split the string only at the first occurrence:
txt = «The rain in Spain»
x = re.split(«\s», txt, 1)
print(x)
The sub() Function
The sub() function replaces the matches with the text of your choice:
Example
Replace every white-space character with the number 9:
txt = «The rain in Spain»
x = re.sub(«\s», «9», txt)
print(x)
You can control the number of replacements by specifying the count parameter:
Example
Replace the first 2 occurrences:
txt = «The rain in Spain»
x = re.sub(«\s», «9», txt, 2)
print(x)
Match Object
A Match Object is an object containing information about the search and the result.
Note: If there is no match, the value None will be returned, instead of the Match Object.
Example
Do a search that will return a Match Object:
txt = «The rain in Spain»
x = re.search(«ai», txt)
print(x) #this will print an object
The Match object has properties and methods used to retrieve information about the search, and the result:
.span() returns a tuple containing the start-, and end positions of the match.
.string returns the string passed into the function
.group() returns the part of the string where there was a match
Example
Print the position (start- and end-position) of the first match occurrence.
The regular expression looks for any words that starts with an upper case «S»:
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.span())
Example
Print the string passed into the function:
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.string)
Example
Print the part of the string where there was a match.
The regular expression looks for any words that starts with an upper case «S»:
txt = «The rain in Spain»
x = re.search(r»\bS\w+», txt)
print(x.group())
Note: If there is no match, the value None will be returned, instead of the Match Object.
How to find all matches in a regular expression
I tried with both regex.findall and search I am getting the entire part when multiple occurences are there. Do I need to set any flags for searching multiple occurences are is there a problem with my regex itself. First three lines are working but
sample_string = 'asdfanksdfkjasdf_ash' sample_str = "asdfasdfasdf_ash" sample_st = assdfvb/23+sdf_ash sample_s : 'assdfvb/23+sdf_ash' sample = >
Please be more clear in your question. Write what is the input what is the output and what is your expected output.
@Noname: Let me clarify my statement: If you have some way to separate JSON apart from other input, you should use a JSON parser to deal with them.
2 Answers 2
The problem with your pattern is the .* .
By default, the regex engine is greedy, .* consumes as much as it can. To change this behaviour, you can use a lazy quantifier. Adding the extra «?» in .*? makes it repeat as few as possible.
Also, you may want to make it fail in cases where a value doesn’t end in «_ash» , checking for quotes in quoted text, or a space if it’s not quoted:
- ([«‘]) captures the quote in group 1
- (?:(?!\1).)* matches any char except the quote captures in group 1
- \1 matches the closing quote (the same used as opening quote)
- \S* with unquoted text, match anything except spaces
- (?!\S) check the value ends there
The values are captured in .group(2) if they’re in quotes, or in .group(3) if unquoted.
#python 2.7.10 import re text = """sample = >""" n = 0 pattern = re.compile( r'[=:]\s*(?:(["\'])((?:(?!\1).)*_ash)\1|(\S*_ash))') #loop all matches for match in pattern.finditer(text): n += 1 print '\nMatch #%s:' % n #Show groups 2 and 3 captures for i in range(2,4): print 'Group %s - [%s:%s]: %s' % (i, match.start(i), match.end(i), match.group(i))
Python regex find all matches
I’m using python 2.7 re library to find all numbers written in scientific form in a string. I’m using the following code:
import re y = re.findall(".(9+\.9+[eE][-+]?6+).","") print y
However, the output is only [‘8.25e+07’] while I’m expecting something like [(‘8.25e+07’),(8.26206e+07)] . I’ve been trying around but couldn’t find where the problem is. If I input y = re.findall(«.(5+\.1+[eE][-+]?2+).»,»|8.26206e+07>») then it gives [‘8.26206e+07’] so the pattern is matching the second number but I don’t get it why it doesn’t match both at the same time.
4 Answers 4
You are slightly overcomplicating your regex by misusing the . which matches any character while not actually needing it and using a capturing group () without really using it.
With your pattern you are looking for a number in scientific notation which has to be BOTH preceded and followed by exactly one character.
After re.findall traverses your string from the beginning it finds your defined pattern, which then drops the < and the | because of your capturing group (..) and saves this as a match. It then continues but only has 8.26206e+07>left. That now does not satisfy your pattern, because it is missing one «any» character for your first . , and no further match is found. Note that findall only looks for non-overlapping matches [1].
To illustrate, change your input string by duplicating your separator | :
>>> p = ".(7+\.1+[eE][-+]?7+)." >>> s = "<8.25e+07||8.26206e+07>" >>> print(re.findall(p, s)) ['8.25e+07', '8.26206e+07']
To satisfy your two . s you need two separators between any two numbers.
Two things I would change in your pattern, (1) remove the . s and (2) remove your capturing group ( ) , you have no need for it:
Capturing groups can be very useful if you need to refer to specific captured groups again later, but your task at hand has no need for them.