Я определяю функцию в 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
Попробуй re.sub(r'(/some/path/here/[^/]*_)[^/_]*(/read)', r'\1\2', s)
, смотри regex101.com/r/VBzHuS/1
Тогда как от них спастись?
Спасибо, это работает. r
говорит, что скопируйте всю подстроку раньше? Не могли бы вы подробнее объяснить значение [^/]*_)[^/_]*
(может быть, в ответе)?
Использовать это
str2 = "http://99.199.9.90:22/some/path/here/myid_31654/read"
str2 = re.sub("myid_[0-9]+","myid_",str2)
Для документации по методу sub
и другим приложениям обратитесь к документы
внутри квадратных скобок
[.+?]
символы интерпретируются как буквальный - не как обычно (один или несколько, но ленивый)