使用正则表达式python重新排列文件行的部分

时间:2015-06-09 22:26:34

标签: python regex string csv regex-group

所以我创建的脚本将通过具有特定格式的文件并将其重新排列为与另一个文件相同的格式。以下是未格式化文件的示例

, 0x40a846, mov [ecx+2bh],al, 88 41 2B, , , , \par
, 0x40a849, jmp $+001775cbh (0x581e14), E9 C6 75 17 00, , , , \par
, 0x40a84e, int3, CC, , , , \par
, 0x40a84f, int3, CC, , , , \par
, 0x40a850, push esi, 56, , , , \par
, 0x40a851, mov esi,ecx, 8B F1, , , , \par

最终目标是让文件的每一行看起来像这样

0x40a846, 0x 88 41 2B ,"mov [ecx+2bh],al",,,

我的主要问题是文件的某些行只有一段源代码,而其他行有2段,这使我很难制作一个正则表达式来抓取它们而不会意外地抓取代码字节。我想使用捕获组重新排列每行的信息。以下是我的脚本:

import csv
import string
import re, sys
file_to_change = 'testingthecodexlconverter.csv'
    # = raw_input("Please specify what codexl file you would like to convert: ")
file1 = open(file_to_change, 'r+')

with file1  as f:
    for line in f:
        line = line[2:-12]
        line = line.rstrip('\n') + ',,'
       # mo = re.search(r'(.*?),.*?.*?,.*?(.*?),.*?.*?,.*?(.*?),.*?.*?,.*?(.*?)', line)
       #mo = re.search(r'(.*?),.*?(.*?,.*?.*?,).*?.*?,.*?(.*?),.*?.*?,.*?(.*?)', line)
        mo = re.search(r'(.*?),.*?(.*?.*?,\S*?,).*?.*?.*?,.*?(.*?),', line)  
        if mo:
            print(mo.group(2))

有人可以帮我一把吗?

3 个答案:

答案 0 :(得分:1)

您可以按照其他人的建议通过分割逗号来标记您的行,然后在打印时将其添加回来

file_to_change = 'testingthecodexlconverter.csv'

file1 = open(file_to_change, 'r+')

with file1  as f:
    for line in f:
        line = line[2:-12]

        tokens = line.split(',')

        # if column index 3 is empty then print without formatting for
        # unnecessary space.
        if not tokens[3]:
            print(tokens[0] + ", " + tokens[2].strip(" ") + ", " + tokens[1] + ",,,")
        else:
            print(tokens[0] + "," + tokens[3] +  ", " + tokens[2].strip(" ") + ", " + tokens[1] + ",,,")

这将以以下格式打印:

0x40a846, 88 41 2B, al,  mov [ecx+2bh],,,
0x40a849, E9 C6 75 17 00,  jmp $+001775cbh (0x581e14),,,
0x40a84e, CC,  int3,,,
0x40a84f, CC,  int3,,,
0x40a850, 56,  push esi,,,
0x40a851, 8B F1, ecx,  mov esi,,,

答案 1 :(得分:0)

我使用pandas并根据您的需要重新排列列,因为它们似乎是合理的csv格式。此方法还允许您在编辑时可视化如何操作csv中的数据:

import pandas as pd
df = pd.read_csv('inputCSV.csv', header=None).fillna('')
df = df.astype(str)
out = df[[4,1,2]].to_csv(index=False, header=False, coding='utf-8', lineterminator='\r\n', mode='wb')

您的问题很明显,您不清楚每个列中的数据格式是什么。

我相信您输入的csv文件中可能缺少coma。我的建议是搜索这些丢失的逗号并添加它们以获得格式正确的输入文件。

最快的方法当然是使用.split()分割上面提到的字符串,但似乎你不确定你在做什么,因此我建议使用pandas进行解析。

答案 2 :(得分:0)

您可以使用已包含但尚未使用的csv模块。

import csv 

file_path = 'test.csv' 

with open(file_path) as csvfile: 
    reader = csv.reader(csvfile) 
    writer = csv.writer(open('tempfile.csv', 'w'), delimiter=',') 
    for row in reader: 
        new_row = [e.strip() for e in row if len(e.strip()) > 0] 
        # The new row should have the first element, then the last,
        # followed by everything else that wasn't empty.
        new_row = [new_row[0], new_row[-1]] + new_row[1:-1] 
        writer.writerow(new_row)

新的csv文件如下所示:

0x40a846,88 41 2B,mov [ecx+2bh],al 
0x40a849,E9 C6 75 17 00,jmp $+001775cbh (0x581e14) 
0x40a84e,CC,int3
0x40a84f,CC,int3
0x40a850,56,push esi
0x40a851,8B F1,mov esi,ecx