Проверьте, заканчивается ли строка десятичным в 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)