Удалите центральную подстроку из строки с помощью регулярного выражения в Python

Я определяю функцию в Python3 для управления строкой с помощью регулярных выражений.

У меня проблемы с поиском регулярного выражения для извлечения части строки. Рассмотрим следующие входные строки

str1 = "http://99.199.9.90:22/some/path/here/id_type_51549851/read"
str2 = "http://99.199.9.90:22/some/path/here/myid_31654/read"

Для приведенных выше строк я хотел бы получить в качестве вывода следующие строки:

output_str1: "http://99.199.9.90:22/some/path/here/id_type_/read"
output_str2: "http://99.199.9.90:22/some/path/here/myid_/read"

Последнее подчеркивание в выходной строке не является обязательным.

Чтобы быть более общим, было бы лучше, чтобы он работал также со следующей строкой (если возможно):

str3 =  "http://99.199.9.90:22/some/path/here/myid_alphaBeta/read"

вывод

"http://99.199.9.90:22/some/path/here/myid_/read"

Обратите внимание, что IP, порт, пути придуманы, но структура такая.

Я хочу исключить часть строки перед read и после последнего подчеркивания, учитывая тот факт, что раньше могло быть другое подчеркивание.

Итак, в основном мой вывод должен содержать первую часть исходной строки, последнюю часть и соответствовать центральной части, которая не является частью вывода. Другими словами, он должен вырезать центральную совпадающую часть строки

Я начинаю с регулярного выражения, выводящего всю строку:

"(.+?)/some/path/here/(.+?)/read"

Пробовал что-то вроде (.+?)/some/path/here/(.+?)_[.+?]/read

но это не сработало.

Теперь функция (часть, которая должна быть:

def cutURL(str):
    res = str
    if (bool(re.search("(.+?)&someMatch=[0-9]+", str))):
        res = re.search("(.+?)&someMatch=[0-9]+", str).group()
    elif (bool(re.search("(.+?)/devices/(.+?)/read", str))):
        res = re.search("(.+?)/some/path/here/(.+?)/read", str)
    return res

внутри квадратных скобок [.+?] символы интерпретируются как буквальный - не как обычно (один или несколько, но ленивый)

Patrick Artner 18.12.2018 11:26

Попробуй re.sub(r'(/some/path/here/[^/]*_)[^/_]*(/read)', r'\1\2', s), смотри regex101.com/r/VBzHuS/1

Wiktor Stribiżew 18.12.2018 11:27

Тогда как от них спастись?

Francesco Boi 18.12.2018 11:27

Спасибо, это работает. r говорит, что скопируйте всю подстроку раньше? Не могли бы вы подробнее объяснить значение [^/]*_)[^/_]* (может быть, в ответе)?

Francesco Boi 18.12.2018 11:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
64
2

Ответы 2

Из приведенных выше примеров вы можете заменить

_\w+/read$

с участием

_/read

См. демо на regex101.com.

Использовать это

str2 = "http://99.199.9.90:22/some/path/here/myid_31654/read"
str2 = re.sub("myid_[0-9]+","myid_",str2)

Для документации по методу sub и другим приложениям обратитесь к документы

Другие вопросы по теме