Разделить строку в разделителе после первого появления - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть строка, представляющая путь:

'../../../folder.123/../..'

Моя цель - разбить строку на две части следующим образом:

('../../../folder.123','/../..')

Другими словами, учитывая первое вхождениеподстрока, разделенная на первый доступный разделитель (в данном случае /).

Алгоритм, который я имею в виду:

  • Разделить строку в соответствии с os.path.sep
  • Найти индекс первого элемента списка, совпадающего с подстрокой ('.' т.е.)
  • Объединить в две переменные элементы списка токенов до и после найденного индекса

Но на самом деле выглядит слишком много работы для pythonic-функции, которая разбивает строки ... Есть ли какая-то встроенная функция, которую я пропускаю, или условное разбиение вида, которое я мог бы использовать для достиженияцель?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы можете попытаться использовать регулярные выражения для этой работы.

Просто обратите внимание, что это чрезвычайно специфическое (и в то же время общее) регулярное выражение, основанное на вашем единственном примере.

import re

_REGEX = re.compile('^(((\.\.?)?\/)*[^\/]*)((\/?(\.\.)?)*)$')

def split_path(path):
    structure = _REGEX.match(path or '').groups()
    return structure[0], structure[3]

Тестирование

>>> split_path('../../../folder.123/../..')
('../../../folder.123', '/../..')

>>> split_path('../../../folder.123')
('../../../folder.123', '')

>>> split_path('folder.123')
('folder.123', '')

>>> split_path('/')
('/', '')

>>> split_path('')
('', '')
0 голосов
/ 19 февраля 2019

str.parition, кажется, то, что вы ищете:

str. partition ( сеп *)1012 *)

Разбить строку в первое вхождение из sep и вернуть 3-кортеж, содержащий часть перед разделителем, сам разделитель ичасть после разделителя.Если разделитель не найден, верните 3 кортежа, содержащего саму строку, за которой следуют две пустые строки.

s = '../../../folder.123/../..'
p1, p2, p3 = s.partition('folder.123')
my_tup = (p1 + p2, p3)

# ('../../../folder.123', '/../..')
0 голосов
/ 19 февраля 2019

Если я правильно понимаю ваш вопрос, это работает:

substr = 'folder.123'
location = '../../../folder.123/../..'

separated = location.split(substr, 1)
separated[0] += substr

Это дает:

['../../../folder.123', '/../..']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...