Reputation: 57
I have the following code:
text = str('''\
num1 - 1.23
num2-3.21
num3 - 9.31\
''')
re.findall(r'[\d.]+', str([i for i in text.split('\n')]))
Please note how num2 did not have any spaces.
This returns:
['1', '1.23', '2', '3.21', '3', '9.31']
However I only want to return a list of the value of each num.
['1.23', '3.21', '9.31']
Does anyone know how I can ignore the first digit attached to num and only retrieve the digits after a space or a hyphen?
Upvotes: 0
Views: 361
Reputation: 163362
If you are using re.findall you can use a capture group.
To prevent a partial word match at the end of the digits, you could add a word boundary \b
if desired.
[ -](\d+(?:\.\d+)?)
Explanation
[ -]
Match either a space or hyphen(
Capture group 1
\d+(?:\.\d+)?
Match 1+ digits with an optional decimal part)
Close group 1import re
text = ("num1 - 1.23\nnum2-3.21\nnum3 - 9.31")
print(re.findall(r'[ -](\d+(?:\.\d+)?)', text))
Output
['1.23', '3.21', '9.31']
Upvotes: 1
Reputation: 8556
You can search and learn about lookahead and lookbehind in the context of regular expressions.
only retrieve the digits after a space or a hyphen?
re.findall(r'(?<=[ -])\d+(?:\.\d+)?', text)
(?<=[ -])
means: match only if it is preceded by space or hyphen, but do not capture.\d+
means: match one or more digits(?:\.\d+)?
means: optionally, match if followed by a dot with one or more digits, and capture.Upvotes: 2