使用regex sub从文本文件中删除行

时间:2014-04-21 18:58:50

标签: python regex

我有一个文本文件,包含这样的行:

Fruit=Apple
Id=#1001
Weight=7
Color=Red
...
Fruit=Watermelon
Id=#1002
Weight=20
Color=Green
...
Fruit=Cherry
Id=#1003
...

我正在尝试删除与水果相关的所有行,并删除要删除的水果ID。所以,我在#1002中读到了,我希望从Fruit=Watermelon一直删除所有行(但不包括Fruit=Cherry。我不知道每种水果会有多少条信息,它们会有所不同。

我尝试通过以下逻辑使用正则表达式:

repl_string = "Fruit=(.*?)\nId=" + user_inputted_id_to_match + "\n(.*)(?=\nFruit=)"
re.sub(repl_string, "\n", text_file_as_string)

基本上,我将Fruit行,Id行与用户提供给我的内容进行匹配,然后将其他所有内容与下一个Fruit行的前瞻相匹配。这有意义吗?

我运行了它,生成的文本文件只删除了Id的值:

Fruit=Apple
Id=#1001
Weight=7
Color=Red
...
Fruit=Watermelon
Id=
Weight=20
Color=Green
...
Fruit=Cherry
Id=#1003
...

如何删除与给定水果相对应的所有行?

2 个答案:

答案 0 :(得分:1)

我建议比正则表达式更简单的策略。尝试类似这样的伪代码:

user_inputted_id = get_user_inputted_id()

with open(fruitfile) as file:
    while file: # While there is still more in the file
        read in "Fruit=..." line
        read in "Id#=..." line
        if id is not the user specified one:
            keep_data = True
            add fruit and id lines into result list/string
        while next line is not a "Fruit=..." line:
            if keep_data:
                add line to result

当然,与使用正则表达式相比,最终会产生更多代码,但这也会使您设置好以便轻松解析文件并将数据存储在数据结构中。如果您只想将每个水果存储为字典,您可以这样做:

parsed_fruit = []
next_fruit = {}
with open(fruitfile) as file:
    while file:
        next_line = file.readline()
        if 'Fruit=' in next_line and next_fruit: # Makes sure that we don't add the initial empty dictionary
            parsed_fruit.append(next_fruit)
            next_fruit = {}
        next_line_data = next_line.split('=')
        fruit[next_line_data[0]] = next_line_data[1]
    parsed_fruit.append(next_fruit) # Add last fruit in file

然后,只需迭代列表并删除任何具有您想要删除的ID的水果。

答案 1 :(得分:1)

更新了#2:添加了ungreedy量词(?)

这是原始正则表达式:

(?s)Fruit=[^\n]*\nId=#1002.*?(?=Fruit)

将您的更改为:

repl_string = "(?s)Fruit=[^\n]*\nId=" + user_inputted_id_to_match + ".*?(?=Fruit)"

<强> Live demo