Python:从字符串中获取内容

时间:2011-11-04 22:29:12

标签: python string int list-comprehension

好吧所以我在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))

提前致谢有用的评论。

3 个答案:

答案 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。