找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 483|回复: 7

[求助] 急!python按条件合并多行数据

6

主题

10

帖子

10

积分

贫民

积分
10
JLOGAN 发表于 2017-6-19 19:39:37 | 显示全部楼层 |阅读模式
各位前辈,现在遇到一个棘手的问题,求大神指教!
我需要导入日志数据,但是格式比较复杂,其中含有很多类似于:
  1. #####AA####
  2. 123
  3. 456
  4. 789
  5. ####BB####
  6. 11
  7. 22
  8. ########
复制代码
我想要得到:
  1. AA:123456789
  2. BB:1122
复制代码
还有就是类似于:
  1. ###CC#####
  2. a b c
  3. 1 2 3
  4. ###DD###
  5. a b
  6. 1 2
复制代码
要得到:
  1. CC:
复制代码
请问用python怎么实现?








回复

使用道具 举报

2

主题

396

帖子

396

积分

版主

Rank: 7Rank: 7Rank: 7

积分
396

最佳新人热心会员默默耕耘

whydo1 发表于 2017-6-19 22:09:57 | 显示全部楼层
这个不用python. 用文本编辑器的替换功能就可以实现.

以word为例,
1.把##替换为#(反复替换直到没有连续的#).
2.把([a-zA-Z]{1,3})#替换为\1: (需要在替换窗口中选择使用通配符)
3.把^p替换为空
4.把#替换为^p
python3.4.4, win10
回复 支持 反对

使用道具 举报

0

主题

20

帖子

20

积分

贫民

积分
20
zxy 发表于 2017-6-21 09:36:39 | 显示全部楼层
第二种情况的规则是什么?直接打印CC?
回复 支持 反对

使用道具 举报

2

主题

13

帖子

13

积分

贫民

积分
13
hz_oracle 发表于 2017-6-21 22:36:18 | 显示全部楼层
第一种情况:
out_dict = {}
line_value = ""
line_key = ""
with file('test.txt','r') as f:
    for line in f:
        line = line.strip("\n")
        if line.startswith("#") and line.endswith("#"):
            if line_key:
                out_dict[line_key]=line_value
            line_key = line.strip("#")
            line_value = ""
            continue
        else:
            temp = line.strip("\n")
            line_value += temp
print out_dict


第二种情况没看懂。
回复 支持 反对

使用道具 举报

6

主题

10

帖子

10

积分

贫民

积分
10
JLOGAN  楼主| 发表于 2017-7-20 17:12:34 | 显示全部楼层
谢谢各位,非常抱歉,第二种没写全,第二种是:
CC:
    a:1
    b:2
    c:3
DD同理
回复 支持 反对

使用道具 举报

1

主题

27

帖子

27

积分

贫民

积分
27
cdbclx 发表于 2017-7-20 21:11:45 | 显示全部楼层
本帖最后由 cdbclx 于 2017-7-20 21:16 编辑

暂且因为你的 #之间的是连续的大写字母,如果还有其他的,需要改那个正则表达式。 支持两种格式,当然数据最后以及放到字典了,你怎么打印就看你自己了
import re
d={}
n=""
with open('xxx.txt') as fp:
    for line in fp:
        line=line.strip()
        x=re.match("#+([A-Z]+)#+",line)
        if x is not None:
            if n:
                if isinstance(l[0],list):
                    v=dict(zip(l[0],l[1]))
                else:
                    v=l[0]
                d[n]=v
            n=x.group(1)
            l=[]
        else:
            x=line.split()
            if len(x)>1:
                l.append(x)
            else:
                if len(l)>0:
                    l[0]+=line
                else:
                    l.append(line)
   
    if len(l)>0:
        if isinstance(l[0],list):
            v=dict(zip(l[0],l[1]))
        else:
            v=l[0]
        d[n]=v
print d
回复 支持 反对

使用道具 举报

6

主题

10

帖子

10

积分

贫民

积分
10
JLOGAN  楼主| 发表于 2017-7-21 09:20:08 | 显示全部楼层
cdbclx 发表于 2017-7-20 21:11
暂且因为你的 #之间的是连续的大写字母,如果还有其他的,需要改那个正则表达式。 支持两种格式,当然数据 ...

明白,多谢多谢
回复 支持 反对

使用道具 举报

0

主题

20

帖子

20

积分

贫民

积分
20
zxy 发表于 2017-7-21 10:09:59 | 显示全部楼层
import re
with open('file.txt') as f:
        t=f.readlines()
n = ''
c = 0
for i in t:
        if re.search(r'#+[A-Z]+#+',i):
                if t.index(i)==0:
                        pass
                else:
                        if c == 1:
                                print m.replace("\n","")+":"
                                for k in range(len(l)):
                                        print l[k]+":"+p[k]
                        else:
                                print m.replace('\n','')+':'+n
                m = n = ''
                m=i.replace('#','')
                c = 0
        elif re.search(r'[0-9]+',i):
                if c == 1:
                        p=i.split()
                else:
                        n = n+str(i.replace('\n',''))
        elif re.search(r'[a-z]+',i):
                c = 1
                l=i.split()
print m.replace('\n','')+':'+n
for k in range(len(l)):
        print l[k]+":"+p[k]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表