Scanf-like Input Conversion in Python


#!/usr/bin/env python3
#-*- coding:utf-8 -*-

# scanf-like input conversion
import re

scanf= lambda inpstr,funcs: [ func(e) if func else e  for e,func in zip(inpstr.split(),funcs) ]

rscanf=lambda inpstr,funcs,sep=None: [ func(e) if func else e  for e,func in zip(inpstr.split() if not sep else re.match(sep,inpstr).groups() if len(sep)>1 else inpstr.split(sep),funcs) ]


if __name__=="__main__":
    
    text1= "42   3.14  1e6  karakterlánc"

    ii,f,ff,s= scanf(text1,(int,float,float,None))
    print("I.",ii,f,ff,s)
    #------------------------------------------------------

    print( "II.",rscanf(text1,(int,float,float,None)) )
    #------------------------------------------------------

    text2= " 42  töltelék1  3.14  töltelék2 karakterlánc 5.2  senkit sem érdekel"
    regex= r"\s*(\d+)\s+(?:\w+\s+)?(\d+)\.(\d+)\s+(?:\w+\s+)?(\w+)\s+(\d+\.\d+)"

    print( "III.",rscanf(text2,(int,int,int,None,float),regex) )
    #i,whole,fraction,s,f= rscanf(text2,(int,int,int,None,float),regex)
    #------------------------------------------------------

    text3= "136;137;138.99;hup;hupi;1e3"
    print( "IV.",rscanf(text3,(int,int,float,None,None,float),";") )
    #i1,i2,f1,s1,s2,f2= rscanf(text3,(int,int,float,None,None,float),";")

Kimenetek:


I. 42 3.14 1000000.0 karakterlánc
II. [42, 3.14, 1000000.0, 'karakterlánc']
III. [42, 3, 14, 'karakterlánc', 5.2]
IV. [136, 137, 138.99, 'hup', 'hupi', 1000.0]