替换字符串特定部分中的特定子字符串

2024-05-29 11:27:39 发布

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

我有一个下面的文本文件,将以某种方式进行编辑。文件中位于(初始化:部分)内部的部分将被覆盖,除此之外,不应进行任何编辑

文件:

(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:部分中的每一行。在这种情况下,我想替换:

  1. (击球手优先击球手)与(击球手无击球手)

  2. (投球手无投球手)与(投球手优先投球手)

  3. (第三裁判)和(裁判腿)

  4. (观众无观众)和(观众无观众)

我目前拥有的代码如下:

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点

我有三个问题

  1. 此代码还更改了(目标:部分中的“(击球手优先\u击球手)”部分,这是我不想要的。我只希望它更改(初始:部分

  2. 目前对于(init:部分中的其他字符串,我必须用不同的语句重新编写此代码。对于例如:for'(bowler none_bowler)'即上面的第2点,我必须再次获得编码行的副本,我认为这不是一种好的编码技术。有更好的方法吗。

  3. >P>如果在<强>(init:)中的第一个字符串将被重写,即(BATSMEN FISTSTY BATSMAN)。在Python中是否有一种方法,不管在字符串中的问号部分中写了什么(Basmim?可以用替换。现在它是第一个,但即使它写的是第二个((击球员第二个)或最后一个((击球员最后一个击球员)),我想用(击球员无击球员)替换它。

对这些问题有什么想法吗

谢谢


Tags: 文件字符串代码noneinitfirst观众投球
1条回答
网友
1楼 · 发布于 2024-05-29 11:27:39

首先,您需要找到init-group。init-组似乎具有以下结构:

(:init
    ...
)

其中...是括号内包含的文本的某种重复,例如"(batsmen first_batsman)"。正则表达式是在文本中定位此类模式的强大方法。如果您不熟悉正则表达式(或简称regex),请查看here

以下正则表达式定位此组:

import re

#Matches the items in the init-group:
item_regex = r"\([\w ]+\)\s+"
#Matches the init-group including items:
init_group_regex = re.compile(r"(\(:init\s+({})+\))".format(item_regex)) 

init_group = init_group_regex.search(s).group()

现在match中有了init-组。下一步是找到要替换的术语,并实际替换它re.sub可以做到这一点!首先将映射存储在字典中:

mappings = {'batsmen first_batsman': 'batsmen '+ predicate_batsmen + '_batsman',
'bowler none_bowler': 'bowler first_bowler',
'umpire third_umpire': 'umpire leg_umpire',
'spectator no_spectator': 'spectator empty_spectator'}

查找引用并将其逐个替换为相应的值:

for key, val in mappings.items():
    init_group = re.sub(key, val, init_group)

最后,您可以替换原始字符串中的init-组:

s = init_group_regex.sub(init_group, s)

这真的很灵活您可以在mappings中使用正则表达式使其匹配您喜欢的任何内容,包括:

mappings = {'batsmen \w+_batsman': '(batsmen '+ predicate_batsmen + '_batsman)'}

匹配'batsmen none_batsman''batsmen first_batsman'

相关问题 更多 >

    热门问题