Пропустить слеши в регулярном выражении, пока не найдётся определённая строка

Рейтинг: 0Ответов: 3Опубликовано: 01.05.2023

Недавно я экспериментировал с regex. Тестировал на этом сайте, потом на Python. У меня есть следующее выражение:

^(Resources\/)*

Вот мои строки:

Resources/
Resources/hello
Resources/test
Resources/Resources/abc123
Resources/Hello
Resources/Resources/Resources/sup.txt
Resources/mods/Resources/Unknown.test/test.txt

Ожидаемый вывод:

Resources/
Resources/hello
Resources/test
Resources/abc123
Resources/Hello
Resources/sup.txt
Resources/mods/Unknown.test/test.txt

Полученный вывод:

Resources/
Resources/hello
Resources/test
Resources/Resources/abc123
Resources/Hello
Resources/Resources/Resources/sup.txt
Resources/mods/Resources/Unknown.test/test.txt

Я также пробовал изменять выражение: ^(Resources\/)*
Но результат был тот же самый.
Вот мой код Python:

from re import sub as regexsub
# ...
class ...:
    resfold_nosep = 'Resources'
    sep = '/'
    # ...
    def ...(...):
        # ...
        path = ...
        regexsub("({}{}){2,}".format(self.resfold_nosep, sep), "", path, 1)

Мой вопрос: как сделать так, чтобы в строках заменялись все случаи появления Resources/?

Ответы

▲ 6Принят
import re


lst = '''
Resources/
Resources/hello
Resources/test
Resources/Resources/abc123
Resources/Hello
Resources/Resources/Resources/sup.txt
Resources/mods/Resources/Unknown.test/test.txt
'''.split()

for s in lst:
    print(re.sub('/Resources', '', s), '<-', s)
Resources/ <- Resources/
Resources/hello <- Resources/hello
Resources/test <- Resources/test
Resources/abc123 <- Resources/Resources/abc123
Resources/Hello <- Resources/Hello
Resources/sup.txt <- Resources/Resources/Resources/sup.txt
Resources/mods/Unknown.test/test.txt <- Resources/mods/Resources/Unknown.test/test.txt

P.S. Namerek в комментарии правильно говорит что регулярное выражание не нужно. Достаточно простой замены:

for s in lst:
    print(s.replace('/Resources', ''), '<-', s)
▲ 1

Без regex, как будто бы удобнее, но тут дело вкуса)

arr = ['Resources/',
       'Resources/Hello',
       'Resources/Resources/abc123',
       'Resources/Resources/Resources/sup.txt',
       'Resources/mods/Resources/Unknown.test/test.txt',]
for path in arr:
    path = 'Resources/' + ''.join(path.split('Resources/'))
    print(path)

Вывод:

Resources/
Resources/Hello
Resources/abc123
Resources/sup.txt
Resources/mods/Unknown.test/test.txt
▲ 0
import re

text = """Resources/
Resources/hello
Resources/test
Resources/Resources/abc123
Resources/Hello
Resources/Resources/Resources/sup.txt
Resources/mods/Resources/Unknown.test/test.txt"""

print(
    re.sub(r'(?<!^)Resources/', '', text, flags=re.M)
)

Resources/
Resources/hello
Resources/test
Resources/abc123
Resources/Hello
Resources/sup.txt
Resources/mods/Unknown.test/test.txt