在python中使用re group()返回None

2024-10-01 22:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我处理的文本文件(itemsList)具有以下格式:

id "item 1"
str "item 1 description"

id "item 2"
str "item 2 description"

试着用Python这样读这个文件:

^{pr2}$

我有个错误:

TypeError: must be str, not NoneType

编辑Result.group(3)str(Result.group(3)) 在小组中不给这个答案:

item 1None
item 2None

预期结果如下:

item 1, item 1 description
item 2, item 2 description

Tags: 文件id格式错误groupdescriptionberesult
1条回答
网友
1楼 · 发布于 2024-10-01 22:30:17

正则表达式使用|。因此,要么在前3组中匹配,要么在后3组中匹配。其他组值返回为None。因此,如果id匹配,Result.group(3)将包含该值,否则{}将包含您的值:

import re

itemList= open('itemsList.txt', encoding="utf8")
items = ''

pattern = re.compile('(id\s)(\"(.*)\")|(str\s)(\"(.*)\")',re.IGNORECASE)

for item in itemList:
    Result = re.search(pattern,item)

    if Result:
        if Result.group(3):
            items += Result.group(3) + ','
        else:
            items += Result.group(6)
    else:
        items += "\n"        

print(items)        

这将打印以下内容:

^{pr2}$

另一种方法是避免使用正则表达式,而是将其视为CSV文件的特殊情况。在本例中,空格字符将作为分隔符,引号将自动作为单独的值处理。然后可以使用同一个库将行保存回新文件:

import csv

with open('input.txt', newline='', encoding='utf-8') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input, delimiter=' ')
    csv_output = csv.writer(f_output)
    block = []

    for row in csv_input:
        if len(row):
            block.append(row)
        elif block:
            csv_output.writerow([block[0][1], block[1][1]])
            block = []

    if block:            
        csv_output.writerow([block[0][1], block[1][1]])

在您的代码中,您一直在附加字符串来创建行。在Python中,这不是首选的解决方案。最好将所有值附加到一个列表中,然后再处理该列表。在

csv_output.writerow()接受行值列表,并在写入文件时自动添加必要的,和换行符。在

我建议您添加print(row)print(block)来理解它是如何工作的。在

相关问题 更多 >

    热门问题