Прежде всего вам нужно найти init
-группу. init
-группа, похоже, имеет структуру:
(:init
...
)
, где ...
- это некоторое повторение текста, содержащегося в скобках, например, "(batsmen first_batsman)"
. Регулярные выражения - это мощный способ найти такие шаблоны в тексте. Если вы не знакомы с регулярными выражениями (или для краткости регулярное выражение), посмотрите здесь .
Следующее регулярное выражение находит эту группу:
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()
Теперь у вас есть init
-группа в match
. Следующий шаг - найти термин, который вы хотите заменить, и фактически заменить его. 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'
et c.