如何从python

时间:2016-12-20 20:47:37

标签: python python-2.7 list split enumerate

我有一个包含数千行的文件,在文件中有一些行如:

Line 115463: 08:59:25.106   08:59:24.992877 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Event2f, DIR = 13)    rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 987 
Line 236362: 08:59:28.647   08:59:28.597827 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Eventab, DIR = 1) rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 934 
Line 324964: 08:59:40.456   08:59:40.403644 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Eventac, DIR = 1) rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 934 
Line 341172: 08:59:40.659   08:59:40.616565 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Eventfb, DIR = 13)    rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 987 
Line 373186: 08:59:41.174   08:59:41.104755 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Event2f, DIR = 1) rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 934 
Line 480217: 08:59:44.481   08:59:44.389453 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Eventx1, DIR = 1) rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 934 
Line 505424: 08:59:44.777   08:59:44.701709 ASDF_IIS_CFGDB  GenMod  Ta-SNS__GENERATED_EVENTS (Event1a, DIR = 1) rrc_UlUtranMsg.c (../../../HEDGE/UL3/ASDF/UtranMsg/Uplink/Code/Src) 934 

我只需要提取子字符串

  

' 1A'

来自

  

' SNS__GENERATED_EVENTS(Event1a,DIR = 1)'

等等。 所以,基本上,'之后的两个字符(事件'

我需要将它们存储在列表中或其他可以使用它们的地方。

我该怎么做?

到目前为止,我已经尝试了以下代码,但它给了我一些混合的值:

events = []

for line in input_txt_file:
        if "Ta-SNS__GENERATED_EVENTS " not in line: continue
        parts = line.split('Event')
        event_temp = [0]
        for i,part in enumerate(parts):
            if part.endswith("Ta-SNS__GENERATED_EVENTS ("): event_temp[0] = parts[i+1].split(None,1)[0].split(',',2)[0]
            events.append(event_temp)

print events

我得到的输出是:

  

[[0],[0],[' 2f'],[' 2f'],[' ab'],[' ab'],[0],[0],[' ac'],[' ac'],[' fb'],... ....]

5 个答案:

答案 0 :(得分:6)

如果线路位置始终固定,Wayne的答案是最有效的。如果位置可能有所不同,这是使用正则表达式的一个不错的情况:

import re
events = []

for line in input_txt_file:
    match = re.search(r'SNS__GENERATED_EVENTS.*?Event(..)', line)
    if match:
        events.append(match.group(1))

这会搜索SNS__GENERATED_EVENTS的每一行,然后搜索一些字符,然后是Event,然后是另外两个字符,并抓取这两个字符。

答案 1 :(得分:3)

如果您知道它总是处于该位置,您可以这样做:

hexes = [line[99:101] for line in file]

如果有些行不包含该文本,您可以这样做:

hexes = [line[99:101] for line in file if 'Ta-SNS__GENERATED_EVENTS' in line]

答案 2 :(得分:1)

我会亲自使用re模块进行子字符串搜索。

import re

for line in input_txt_file:
    val = ''
    val = re.search('SNS__GENERATED_EVENTS \(Event(.+?), DIR\)', line).group(1)
    print(val)

答案 3 :(得分:1)

这里不需要正则表达式:只需根据Ta-SNS__GENERATED_EVENTS (Event进行拆分,如果有第二个字段,则取2个第一个字母:

events=[]
for line in input_txt_file:
    toks = line.split("Ta-SNS__GENERATED_EVENTS (Event")
    if len(toks)>1:
        events.append(toks[1][:2])

编辑:找到一个很酷的单行代码:

events=[tok[:2] for line in input_txt_file for i,tok in enumerate(line.split("Ta-SNS__GENERATED_EVENTS (Event")) if i==1]

使用enumerate并测试分割项目的索引是否为1:表示至少有2个项目。在这种情况下,从令牌中取出2个第一个字符。

EDIT2:Amber甚至更好地使用partition来避免enumerate黑客攻击:

events=[t for t in (l.partition("Ta-SNS__GENERATED_EVENTS (Event")[2] for l in input_txt_file) if t]

答案 4 :(得分:1)

使用re.findall()函数的简短解决方案:

# change to your actual file path
with open('./text_files/events.txt', 'r') as fh:
    l = re.findall(r'(?<=Ta-SNS__GENERATED_EVENTS \(Event)\w+', fh.read(), re.M)

print(l)

输出:

['2f', 'ab', 'ac', 'fb', '2f', 'x1', '1a']