Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python格式化文本文件_Python_Regex - Fatal编程技术网

使用python格式化文本文件

使用python格式化文本文件,python,regex,Python,Regex,我有一个原始文本,如下所示: 0000001AB11117, 2323235-8, This is the description. 00000323CD4111, 1944322, Soft Dimcase andRating 00000033322S11, 2212234-3, 100 BN SN OPTION (LINUX) 00000226644224, 44433AV, aaaaaccaaaaaaa 000000 1AB111172323235-8这是 descrip

我有一个原始文本,如下所示:

0000001AB11117, 2323235-8,  This is the description.
00000323CD4111, 1944322,    Soft Dimcase andRating
00000033322S11, 2212234-3,  100 BN SN OPTION (LINUX)
00000226644224, 44433AV,    aaaaaccaaaaaaa
000000 1AB111172323235-8这是 description.00000323CD411111944322软底壳 ANDRATING 00000033322S112234-31000亿SN期权 (LINUX)000022664422444433avaaaaaaaaaaaaaaa

我正试图将其转换为如下所示:

0000001AB11117, 2323235-8,  This is the description.
00000323CD4111, 1944322,    Soft Dimcase andRating
00000033322S11, 2212234-3,  100 BN SN OPTION (LINUX)
00000226644224, 44433AV,    aaaaaccaaaaaaa
上面的规则是取14个字符(可以是字母和数字的组合),然后插入“,”然后取下7个字符(可以是字母和数字的组合),如果下一个字符是“-”,则包括连字符和直接数字,然后插入“,”,然后读出所有描述,直到找到三个连续的000。一旦找到三个连续的0,我需要在000之前插入新行,然后重复相同的过程,以便格式化它。基本上我想读出所有列的值。请建议可以做什么

我在下面尝试过,但在这里我需要硬编码值以插入“,”或“\n”,但在这里我硬编码,不确定如何使其动态

def format_file(filename, find, insert):
    with open(page2, 'r+') as file:
        lines = file.read()

        index = repr(lines).find(find) - 1
        if index < 0:
            raise ValueError("The text was not found.")

        len_found = len(find) - 1
        existing_lines = lines[index + len_found:]

        file.seek(index)
        file.write(find)
        file.write(insert)
        file.write(existing_lines)

format_file(page2, "0000001AB11117", ', ')
format_file(page2, "2323235-8", ', ')
format_file(page2, "This is the description.", '\n')
def格式_文件(文件名、查找、插入):
打开(第2页,“r+”)作为文件:
lines=file.read()
索引=repr(行)。查找(find)-1
如果指数<0:
raise VALUERROR(“未找到文本”)
len_find=len(find)-1
现有线=线[索引+找到的长度:]
file.seek(索引)
file.write(查找)
文件。写入(插入)
file.write(现有的_行)
格式化_文件(第2页,“0000001AB11117”、“,”)
格式化_文件(第2页,“23235-8”、“,”)
格式化_文件(第2页,“这是说明。”,“\n”)

在这种情况下,您可以通过regexp解析文件文本

  • 上面的规则是使用14个字符(可以是字母和数字的混合)
    -
    [a-zA-Z\d]{14}
  • 然后取下7个字符(可以是字母和数字的组合),如果下一个字符是“-”,则包括连字符和立即数,然后插入“
    -
    [\da-ZA-Z]{7}(\-\d)?
  • 然后读出所有描述,直到我们找到三个连续的000
    -
    +?(?=(000 |$)
请勾选这个:

import re

expr = re.compile(r'(?P<first>[\da-zA-Z]{14})(?P<second>[\da-ZA-Z]{7}(\-\d)?)(?P<third>.+?(?=(000|$)))')

text = '''0000001AB111172323235-8THis is the description.00000323CD41111944322Soft Dimcase andRating00000033322S112212234-3100 BN SN OPTION (LINUX)000022664422444433AVaaaaaccaaaaaaa'''

for m in expr.finditer(text):
    print "{}, {}, {}\n".format(m.group('first'), m.group('second'), m.group('third'))

re
正则表达式模块是解析简单文本结构的好方法。在您的例子中,诀窍是当您点击下一个
000
时,将流分解为记录。使用前瞻模式
(?=000)间接处理字符串
将匹配您的分隔符。我们使用“向前看”,因为您还希望将其作为以下记录的一部分保留。我们还希望在文件末尾终止一条记录,因此使用了可选的
$
模式。该模式的其余部分只是将字段分隔开

re_line = re.compile(r'(.{14})(.{7})(-\d|)(.*?)((?=000)|$)')

with open(page2, 'r') as f:
    for m in re_line.finditer(f.read()):
        print '{0}, {1}{2}, {3}'.format(*m.groups())
产出:

0000001AB11117, 2323235-8, THis is the description.
00000323CD4111, 1944322, Soft Dimcase andRating
00000033322S11, 2212234-3, 100 BN SN OPTION (LINUX)
00002266442244, 4433AVa, aaaaccaaaaaaa

@Shpionus这真的很好。当我将所有文本指定给
text
变量时,它会按预期工作,但当我试图直接从文件中读取时,它不会打印任何内容,可能是因为它一次读取1个字母。请提出建议。@MadPhysician我实现了上述规则。正则表达式匹配所需的模式然后我只是以所要求的格式打印。我试着用expr.finditer(f)中的
open(page2,'r')作为f:m:
但是我得到了TypeError:需要字符串或缓冲区,所以基本上我无法从文件中读取。@ankitpandey您可以逐行读取文件。但是我的脚本是全文的。我不确定您的文件看起来如何。如果文件不大,您可以完全读取到变量并使用此代码。如果文件足够大,需要找到其他迭代方式。@ankitpandey
expr.finditer
使用字符串变量,而不是文件描述。@Mike从
a
的何处进入图片?当我将
a
替换为
f
时,我得到了类型错误:预期的字符串或缓冲区error@ankitpandey那应该是
f.read()
我会更正代码的。对不起,我赶时间。