我必须编写一个接受字符串作为参数的函数,并返回一个布尔值(True或False),该值指示该字符串是否表示有效的基本表达式。
我必须假定这些有效表达式由一个或多个由基本运算符(仅+,-,*和/)分隔的 正 整数组成。字符串必须以整数开头和结尾。此外,单个空格必须始终在有效表达式中分隔整数和运算符。
例如:
>>> chandler("1")
True
>>> chandler("-1")
False
>>> chandler("1 + 22")
True
>>> chandler(" 1 + 22")
False # because this string starts with space
>>> chandler("1 + ")
False
>>> chandler("1 22 * 333")
False
>>> chandler("1 / 2")
False # because of two spaces instead of one
>>> chandler ("23 + 45 - 17 * 2")
True
我不知道如何以及从哪里开始。 我只允许使用与字符串和列表相关的内容(例如方法)
答案 0 :(得分:2)
以下是如何使用正则表达式解决此问题的示例:
import re
def chandler(s):
regex = r'\d+( [+*/-] \d+)*'
if re.fullmatch(regex, s):
return True
else
return False
我们在这里做的是创建一个正则表达式字符串,该字符串指定要识别的模式,然后调用fullmatch()
以确保整个字符串s
与给定的模式匹配。让我们来看一下它的每个部分:
r' # the beginning of a regex string
\d # this is shorthand for "any digit" - e.g. the characters 0 through 9
\d+ # adding '+' to it means "we want at least one of these"
[+*/-] # this specifies a *group* of these four operators we're looking for
( [+*/-] \d+) # We're looking for a single space, followed by any of those four characters,
# followed by another single space, followed by at least one digit
( [+*/-] \d+)* # Adding '*' means "we want at least 0 of that entire expression in the parentheses
我们使用re.fullmatch()
而不是re
的其他方法之一来确保整个字符串与我们想要的匹配。如果我们使用re.match()
,则它将与任何以数字开头的内容匹配,无论字符串的其余部分是否不是我们想要的。
re.fullmatch()
返回一个正则表达式匹配对象,否则返回None
(将其放在if
语句中时为false)。我们只是测试它是否为None
,然后相应地返回True
或False
。
答案 1 :(得分:1)
您可以使用正则表达式:
import re
def chandler(test_str):
return bool(re.fullmatch(r'^\d+(\ [+-/*//]\ \d+)*$', test_str))
print(chandler("1"))
# returns True
print(chandler("-1"))
# returns False
print(chandler("1 + 22"))
# returns True
print(chandler(" 1 + 22"))
# returns False
print(chandler("1 +"))
# returns False
print(chandler("1 22 * 333"))
# returns False
print(chandler("1 / 2"))
# returns False
print(chandler("23 + 45 - 17 * 2"))
# returns True
正则表达式细目:
'\d+'
'\d'' matches any digit (0-9)
'+' means at least once,
so '\d+' means one or more digits i.e. a number
'(\ [+-/*//]\ \d+)*':
'\ ' This matches a space
(The '\' is redundant can just have ' ')
'[+-/*//]' will match one of these: +.-,* or /
(we need to escape '*' and '/' with a '/' because they are special characters)
'\ ' again matches a space
'\d+' again matches a number
This block will match thing like ' + 16',
we can have any number of these so we add a '*'
this is like the '+' but allows us not to have any matches.
So this means zero or more copies of <space><operator><space><number>
答案 2 :(得分:1)
每个人如何使它过于复杂?只是一行代码!
import re
def chandler(s):
return bool(re.match(r'^\d+(\ [\+\-\*\/]\ \d+)*$', s))
简单来说,正则表达式将整个字符串从开始^
映射到结束$
,并期望一个数字\d
(至少一个数字+
)。
如果在操作符号([\+\-\*\/]
之前加一个空格,再由另一个空格加一个至少有一位的数字,则可以添加一个符号。
最后一个部分可以与运算符*
重复多次。