Проверьте, заканчивается ли строка десятичным в Python 2

Я хочу проверить, заканчивается ли строка десятичной дробью различных чисел, из поиска некоторое время самым близким решением, которое я нашел, было ввести значения в кортеж и использовать это в качестве условия для endwith(). Но есть ли более короткий путь вместо ввода каждой возможной комбинации?

Я пытался жестко запрограммировать конечное условие, но если в списке есть новые элементы, они не будут работать с ними, я также попытался использовать регулярное выражение, которое возвращает другие элементы вместе с десятичными элементами. Любая помощь будет оценена

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'

Изменить: Извините, должен был указать, что я не хочу, чтобы 'qwe -70' был принят, должны быть приняты только те элементы с десятичной запятой

6 ответов

Решение

Я хотел бы предложить другое решение: использование регулярных выражений для поиска конечного десятичного числа.

Вы можете определить регулярное выражение для конечного десятичного числа с помощью следующего регулярного выражения [-+]?[0-9]*\.[0-9]+$,

Регулярное выражение разбито на части:

  • [-+]?: необязательно - или + символ в начале
  • [0-9]*: ноль или более цифр
  • \.: обязательная точка
  • [0-9]+: одна или несколько цифр
  • $: должно быть в конце строки

Затем мы можем проверить регулярное выражение, чтобы увидеть, соответствует ли оно любому члену в списке:

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"

Вывод для предыдущего скрипта следующий:

abcd 1.01 passes
zyx 22.98 passes
efgh 3.0 passes
qwe -70 does not pass
test does not pass
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

Как вы правильно догадались, endswith() Это не хороший способ посмотреть на решение, учитывая, что количество комбинаций в основном бесконечно. Путь состоит в том, как многие предлагали, использовать регулярное выражение, которое будет соответствовать концу строки, чтобы быть десятичной точкой, за которой следует любое количество цифр. Кроме того, сохраняйте код простым и читабельным. strip() находится там на всякий случай, если входная строка имеет дополнительный пробел в конце, что излишне усложнит регулярное выражение. Вы можете увидеть это в действии по адресу: 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'

Может быть, течет помочь:

import re

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

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

Я думаю, что это будет работать для этого случая:

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

Данные вашего примера оставляют открытыми многие возможности:

Последний символ является цифрой:

e[-1].isdigit()

Все после последнего пробела является числом:

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

Используя регулярные выражения:

re.match('[.0-9]$', e)
Другие вопросы по тегам