我有一个文本文件,包含这样的行:
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
...
如何删除与给定水果相对应的所有行?
答案 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 强>