我想检查字符串是否以不同数字的小数结尾,从搜索一段时间开始,我找到的最接近的解决方案是将值输入到元组中并将其用作endswith()的条件。但是有没有更短的方式而不是输入所有可能的组合?
我尝试对结束条件进行硬编码,但是如果列表中有新元素它不适用于那些,我也尝试使用正则表达式,它也会返回其他元素和十进制元素。任何帮助将不胜感激
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'要被接受,只接受那些带小数点的元素
答案 0 :(得分:2)
我想提出另一个解决方案:使用regular expressions搜索结束小数。
您可以使用以下正则表达式[-+]?[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
答案 1 :(得分:0)
您的示例数据留下了许多可能性:
最后一个字符是数字:
e[-1].isdigit()
最后一个空格后的所有内容都是数字:
try:
float(e.rsplit(None, 1)[-1])
except ValueError:
# no number
pass
else:
print "number"
使用正则表达式:
re.match('[.0-9]$', e)
答案 2 :(得分:0)
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
答案 3 :(得分:0)
我认为这适用于这种情况:
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
答案 4 :(得分:0)
正如您所猜测的那样,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'
答案 5 :(得分:0)
流动可能会有所帮助:
import re
reg = re.compile(r'^[a-z]+ \-?[0-9]+\.[0-9]+$')
if re.match(reg, the_string):
do something...
else:
do other...