Вы можете использовать пробел в качестве разделителя использовать командную строку анализатор командного интерпретатора:
$ myscript --replace=foo bar \
> --replace=/etc/hosts /etc/foo gi \
> [email protected] [email protected]
g
флага по умолчанию в Python, так что вы должны добавить специальную поддержку для него:
#!/usr/bin/env python
import re
from argparse import ArgumentParser
from functools import partial
all_re_flags = 'Lgimsux' # regex flags
parser = ArgumentParser(usage='%(prog)s [--replace PATTERN REPL [FLAGS]]...')
parser.add_argument('-e', '--replace', action='append', nargs='*')
args = parser.parse_args()
print(args.replace)
subs = [] # replacement functions: input string -> result
for arg in args.replace:
count = 1 # replace only the first occurrence if no `g` flag
if len(arg) == 2:
pattern, repl = arg
elif len(arg) == 3:
pattern, repl, flags = arg
if ''.join(sorted(flags)) not in all_re_flags:
parser.error('invalid flags %r for --replace option' % flags)
if 'g' in flags: # add support for `g` flag
flags = flags.replace('g', '')
count = 0 # replace all occurrences
if flags: # embed flags
pattern = "(?%s)%s" % (flags, pattern)
else:
parser.error('wrong number of arguments for --replace option')
subs.append(partial(re.compile(pattern).sub, repl, count=count))
Вы можете использовать subs
следующим образом:
input_string = 'a b a b'
for replace in subs:
print(replace(input_string))
экзамен PLE:
$ ./myscript -e 'a b' 'no flag' -e 'a B' 'with flags' ig
Выход:
[['a b', 'no flag'], ['a B', 'with flags', 'ig']]
no flag a b
with flags with flags
Вам нужно будет написать свой собственный парсер для разбора 'S/Foo/бар/G' в' регулярное выражение, ReplaceWith, flags' и обрабатывать спасаясь сепараторов. – Eric
На данный момент, было бы проще просто использовать sed? –
Как только вы разделите шаблон замещения на свой шаблон и запасные части, вы можете использовать 're.compile()' для создания объекта regexp. – Barmar