好吧所以我在python中创建了一个完全符合我想要它的方法,但是它非常难看和重复,它需要做的就是在输入字符串中获取前4个整数并以形式返回它们(( int1,int2),(int3,int4))。使用列表理解或类似的东西,必须有更好的方法(甚至在一行中)。任何想法??
def getMove(playerInput) :
nextNum = 0
x1 = 0
y1 = 0
x2 = 0
y2 = 0
for c in playerInput:
try:
if nextNum==0 :
x1 = int(c)
nextNum += 1
elif nextNum==1 :
y1 = int(c)
nextNum += 1
elif nextNum==2 :
x2 = int(c)
nextNum += 1
elif nextNum==3 :
y2 = int(c)
nextNum += 1
else :
return ((x1,y1),(x2,y2))
except ValueError:
break
return ((x1,y1), (x2,y2))
提前致谢有用的评论。
答案 0 :(得分:2)
这就是你想要的,使用正则表达式和简单的列表理解。
这对恶劣的输入非常强大。它通过查找由任何非数字字符分隔的输入中的前4个整数来符合您对“输入字符串中的前4个整数”的请求。
import re
def getMove(playerInput):
m = re.search('([\d]+)[\D]*([\d]+)[\D]*([\d]+)[\D]*([\d]+)[\D]*', playerInput)
if m:
nums = [int(x) for x in m.groups()]
else:
raise ValueError("Invalid argument")
return ((nums[0], nums[1]),(nums[2], nums[3]))
输入/输出示例:
输入:"((12,5wf),(21,4xx))"
输出:((12, 5), (21, 4))
输入:"((0,1),(2,3))"
输出:((0, 1), (2, 3))
输入:" (0, 1),(2, 3)"
Ouptut:((0, 1), (2, 3))
注意:这将始终尽力获得4个数字,所以如果输入是(12,5,4)而不是提出ValueError,它将选择1,2,5和4作为数字。如果您对输入格式提出了更严格的要求,可以调整正则表达式匹配以避免此问题。如果我误解了你的输入格式,请告诉我,我可以修复表达式以避免这种行为。
答案 1 :(得分:1)
试试这个:
r = [int(c) for c in playerInput[:4]]
while len(r) < 4:
r.append(0)
x1, y1, x2, y2 = r
return ((x1, y1), (x2, y2))
答案 2 :(得分:0)
regexxy:
import re
def bla(playerInput):
m = re.match('.*?(\d{1,4}).*', playerInput)
if m != None:
x1, x2, x3, x4 = [int(c) for c in m.group(1).ljust(4, '0')]
return ((x1, x2), (x3, x4))
else:
raise Exception("invalid Input")
它更宽容,它需要字符串中的前1到4位数字并填充0。