SSY
SSY

Reputation: 13

Check if a string ends with a decimal in Python 2

I want to check if a string ends with a decimal of varying numbers, from searching for a while, the closest solution I found was to input values into a tuple and using that as the condition for endswith(). But is there any shorter way instead of inputting every possible combination?

I tried hard coding the end condition but if there are new elements in the list it wont work for those, I also tried using regex it returns other elements together with the decimal elements as well. Any help would be appreciated

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"]

for e in list1:
    if e.endswith('.0') or e.endswith('.98'):
        print 'pass'

Edit: Sorry should have specified that I do not want to have 'qwe -70' to be accepted, only those elements with a decimal point should be accepted

Upvotes: 1

Views: 2163

Answers (6)

danche
danche

Reputation: 1815

The flowing maybe help:

import re

reg = re.compile(r'^[a-z]+ \-?[0-9]+\.[0-9]+$')

if re.match(reg, the_string):
    do something...
else:
    do other...

Upvotes: 0

sal
sal

Reputation: 3593

As you correctly guessed, endswith() is not a good way to look at the solution, given that the number of combinations is basically infinite. The way to go is - as many suggested - a regular expression that would match the end of the string to be a decimal point followed by any count of digits. Besides that, keep the code simple, and readable. The strip() is in there just in case one the input string has an extra space at the end, which would unnecessarily complicate the regex. You can see this in action at: https://eval.in/649155

import re
regex = r"[0-9]+\.[0-9]+$"

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"]

for e in list1:
    if re.search(regex, e.strip()):
       print e, 'pass'

Upvotes: 0

dmlittle
dmlittle

Reputation: 999

I'd like to propose another solution: using regular expressions to search for an ending decimal.

You can define a regular expression for an ending decimal with the following regex [-+]?[0-9]*\.[0-9]+$.

The regex broken apart:

  • [-+]?: optional - or + symbol at the beginning
  • [0-9]*: zero or more digits
  • \.: required dot
  • [0-9]+: one or more digits
  • $: must be at the end of the line

Then we can test the regular expression to see if it matches any of the members in the list:

import re

regex = re.compile('[-+]?[0-9]*\.[0-9]+$')
list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70", "test"]

for e in list1:
  if regex.search(e) is not None:
    print e + " passes"
  else:
    print e  + " does not pass"

The output for the previous script is the following:

abcd 1.01 passes
zyx 22.98 passes
efgh 3.0 passes
qwe -70 does not pass
test does not pass

Upvotes: 2

Gokul S Krishnan
Gokul S Krishnan

Reputation: 1

I think this will work for this case:

regex = r"([0-9]+\.[0-9]+)"

list1 = ["abcd 1.01", "zyx 22.98", "efgh 3.0", "qwe -70"]

for e in list1:
    str = e.split(' ')[1]
    if re.search(regex, str):
       print True #Code for yes condition
    else:
       print False #Code for no condition

Upvotes: 0

Nidhin Bose J.
Nidhin Bose J.

Reputation: 1092

suspects = [x.split() for x in list1] # split by the space in between and get the second item as in your strings

# iterate over to try and cast it to float -- if not it will raise ValueError exception

for x in suspects:
    try:
        float(x[1])
        print "{} - ends with float".format(str(" ".join(x)))
    except ValueError:
        print "{} - does not ends with float".format(str(" ".join(x)))

## -- End pasted text --

abcd 1.01 - ends with float
zyx 22.98 - ends with float
efgh 3.0 - ends with float
qwe -70 - ends with float

Upvotes: 0

Daniel
Daniel

Reputation: 42758

Your example data leaves many possibilities open:

Last character is a digit:

e[-1].isdigit()

Everything after the last space is a number:

try:
    float(e.rsplit(None, 1)[-1])
except ValueError:
    # no number
    pass
else:
    print "number"

Using regular expressions:

re.match('[.0-9]$', e)

Upvotes: 0

Related Questions