Kevin Guo
Kevin Guo

Reputation: 97

How to extract a number before a certain words?

There is a sentence "i have 5 kg apples and 6 kg pears".

I just want to extract the weight of apples.

So I use

sentence = "I have 5 kg apples and 6 kg pears"
number = re.findall(r'(\d+) kg apples', sentence)
print (number)

However, it just works for integer numbers. So what should I do if the number I want to extract is 5.5?

Upvotes: 4

Views: 1310

Answers (7)

Fabrizio
Fabrizio

Reputation: 8043

The regex you need should look like this:

(\d+.?\d*) kg apples

You can do as follows:

number = re.findall(r'(\d+.?\d*) kg apples', sentence)

Here is an online example

Upvotes: 0

Mohammad Yusuf
Mohammad Yusuf

Reputation: 17054

You can try something like this:

import re

sentence = ["I have 5.5 kg apples and 6 kg pears",
                   "I have 5 kg apples and 6 kg pears"]
for sen in sentence:
    print re.findall(r'(\d+(?:\.\d+)?) kg apples', sen)

Output:

['5.5']
['5']

Upvotes: 2

tihom
tihom

Reputation: 8003

Non-regex solution

sentence = "I have 5.5 kg apples and 6 kg pears"
words  = sentence.split(" ")

[words[idx-1] for idx, word in enumerate(words) if word == "kg"]
# => ['5.5', '6']

You can then check whether these are valid floats using

try:
   float(element)
except ValueError:
   print "Not a float"

Upvotes: 1

Bobby
Bobby

Reputation: 1571

re.findall(r'[-+]?[0-9]*\.?[0-9]+.', sentence)

Upvotes: 0

Maroun
Maroun

Reputation: 95948

You change your regex to match it:

(\d+(?:\.\d+)?)

\.\d+ matches a dot followed by at least one digit. I made it optional, because you still want one digit.

Upvotes: 0

Dudnikof
Dudnikof

Reputation: 737

You can use number = re.findall(r'(\d+\.?\d*) kg apples', sentence)

Upvotes: 0

mVChr
mVChr

Reputation: 50177

? designates an optional segment of a regex.

re.findall(r'((\d+\.)?\d+)', sentence)

Upvotes: 0

Related Questions