我想在python中检查一个包含句点“。”的字符串,最多一次。
答案 0 :(得分:8)
[^.]*\.?[^.]*$
请务必match
,不要search
>>> dot = re.compile("[^.]*\.[^.]*$")
>>> dot.match("fooooooooooooo.bar")
<_sre.SRE_Match object at 0xb7651838>
>>> dot.match("fooooooooooooo.bar.sad") is None
True
>>>
修改强>:
如果只考虑整数和小数,那就更容易了:
def valid(s):
return re.match('[0-9]+(\.[0-9]*)?$', s) is not None
assert valid("42")
assert valid("13.37")
assert valid("1.")
assert not valid("1.2.3.4")
assert not valid("abcd")
答案 1 :(得分:5)
不需要正则表达式,请参阅str.count()
:
str.count(sub[, start[, end]])
返回[start,end]范围内子串sub的非重叠次数。可选参数start和end被解释为切片表示法。
>>> "A.B.C.D".count(".")
3
>>> "A/B.C/D".count(".")
1
>>> "A/B.C/D".count(".") == 1
True
>>>
答案 2 :(得分:2)
您可以使用:
re.search('^[^.]*\.?[^.]*$', 'this.is') != None
>>> re.search('^[^.]*\.?[^.]*$', 'thisis') != None
True
>>> re.search('^[^.]*\.?[^.]*$', 'this.is') != None
True
>>> re.search('^[^.]*\.?[^.]*$', 'this..is') != None
False
(匹配期间为零或一次。)
答案 3 :(得分:0)
答案 4 :(得分:0)
如果句点在整个字符串中只存在一次,则使用?
运算符:
^[^.]*\.?[^.]*$
打破这个局面:
^
匹配字符串的开头[^.]
匹配零个或多个不是句号的字符\.?
匹配句点字符(必须使用\
进行转义,因为它是保留字符)正好为0或1次[^.]*
与上面2中使用的模式相同$
匹配字符串的结尾顺便说一句,我个人不会使用正则表达式(除非我检查字符串的其他方面是否有效)。我只想使用计数功能。
答案 5 :(得分:0)
为什么需要检查?如果你有一个字符串中的数字,我现在猜你很快就会把它作为一个数字来处理。也许你可以在没有在你跳跃之前看:
的情况下做到这一点try:
value = float(input_str)
except ValueError:
...
else:
...