使用正则表达式将字符串切分为int类型开头,浮点数结尾的所有子串

原因:
自己在看利用pandas进行数据分析这一书籍的时候,生成df的部分的代码是不完整的,但是展示df的地方,df是完整展示的。所以在此编写python程序,实现复制粘贴字符串形式的df来生成DataFrame形式的df。

  • 目标是这个样子的


    image.png

    复制后使用input方法读取后是这样的


    image.png
  • 通过观察得到
    • 第一个数字的左边的两个单词是columns的组成元素
    • 每条记录的不同属性之间由多个\t间隔。组成同一个属性值的不同单词之间只有一个\t
    • 每条记录都是整数开头,浮点数结尾,且开头的整数为index
  • 实现自己目标的思路
    • 利用正则匹配获取columns的所有元素
    • 利用正则获取所有的记录,并且存储到数组中
    • 获取数组记录的后两项作为df的值
def handle(astring,nums):#第一个是输入的字符串,第二个是列数
    # 获取colums,以列表形式存储
    pattern1 = re.compile(r'.*?[0-9]')# .*匹配任意字符,?非贪婪匹配,[0-9]以数值结尾
    k = re.findall(pattern1,astring)[0]# list对象的第一个item是需要的
    pattern2 = re.compile(r'[a-zA-Z]+')#[a-zA-Z]匹配字母,+表示至少出现一次,这里是取出k中的所有单词
    column_list = re.findall(pattern2,k)#columns 对应的列表生成
    #print(column_list) 测试用代码
    
    #获取df的每一行,在这里我称之为记录
    pattern3 = re.compile('[0-9].*?\.[0-9]')# [0-9]是数值开头,\.[0-9]是以浮点数结尾,.*?是非贪婪匹配中间包括任意字符
    record_list = re.findall(pattern3,astring)# 生词record的列表,每条record是'0\t\t\t\t\t\t\t\tbacon\t\t\t\t\t4.0'样子的
    
    #处理record得到记录
    pattern4 = re.compile(r'\t{2,}')
    data_df = [] # 这里本来是想用Dataframe逐行添加数据实现的,但是自己目前不知道怎么做
    for record in record_list:
        t = pattern4.split(record)
        k = list(map(lambda x: x.replace('\t',' '), t)) # 将字符串中的\t替换为 ' '
        data_df.append(k[1:nums+1])
        
        
    df = pd.DataFrame(data_df,columns=column_list)
    return df
astring = input('请在此输入字符串:')
num = eval(input('请在此输入列数(注:不包括index列的列数):'))
df = handle(astring,2)

结果如下所示
image.png

总结:系统的学习太重要了,总是零散的学习,这也要查,那也要查,太浪费时间了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容