我有一个下面的文本文件,将以某种方式进行编辑。文件中位于(初始化:部分)内部的部分将被覆盖,除此之外,不应进行任何编辑
文件:
(define (problem bin-picking-doosra)
(:domain bin-picking-second)
;(:requirements :typing :negative-preconditions)
(:objects
)
(:init
(batsmen first_batsman)
(bowler none_bowler)
(umpire third_umpire)
(spectator no_spectator)
)
(:goal (and
(batsmen first_batsman)
(bowler last_bowler)
(umpire third_umpire)
(spectator full_spectator)
)
)
)
在这个文件中,我想用所需的字符串替换(init:部分中的每一行。在这种情况下,我想替换:
(击球手优先击球手)与(击球手无击球手)
(投球手无投球手)与(投球手优先投球手)
(第三裁判)和(裁判腿)
(观众无观众)和(观众无观众)
我目前拥有的代码如下:
file_path = "/home/mus/problem_turtlebot.pddl"
s = open(file_path).read()
s = s.replace('(batsmen first_batsman)', '(batsmen '+ predicate_batsmen + '_batsman)')
f = open(file_path, 'w')
f.write(s)
f.close()
这里的术语predicate_batsmans包含单词none。这样可以很好地工作。此代码只满足上面提到的第1点
我有三个问题
此代码还更改了(目标:部分中的“(击球手优先\u击球手)”部分,这是我不想要的。我只希望它更改(初始:部分
目前对于(init:部分中的其他字符串,我必须用不同的语句重新编写此代码。对于例如:for'(bowler none_bowler)'即上面的第2点,我必须再次获得编码行的副本,我认为这不是一种好的编码技术。有更好的方法吗。
对这些问题有什么想法吗
谢谢
首先,您需要找到
init
-group。init
-组似乎具有以下结构:其中
...
是括号内包含的文本的某种重复,例如"(batsmen first_batsman)"
。正则表达式是在文本中定位此类模式的强大方法。如果您不熟悉正则表达式(或简称regex),请查看here以下正则表达式定位此组:
现在
match
中有了init
-组。下一步是找到要替换的术语,并实际替换它re.sub
可以做到这一点!首先将映射存储在字典中:查找引用并将其逐个替换为相应的值:
最后,您可以替换原始字符串中的
init
-组:这真的很灵活您可以在
mappings
中使用正则表达式使其匹配您喜欢的任何内容,包括:匹配
'batsmen none_batsman'
、'batsmen first_batsman'
等相关问题 更多 >
编程相关推荐