Как извлечь подстроку между двумя маркерами? - PullRequest
251 голосов
/ 12 января 2011

Допустим, у меня есть строка 'gfgfdAAA1234ZZZuijjk', и я хочу извлечь только часть '1234'.

Я знаю только, какие будут несколько символов непосредственно до AAA, а после ZZZ интересующей меня части 1234.

С помощью sed можно сделать что-то подобное со строкой:

echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"

И это даст мне 1234 в результате.

Как сделать то же самое в Python?

Ответы [ 15 ]

3 голосов
/ 08 февраля 2014
>>> s = '/tmp/10508.constantstring'
>>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')
2 голосов
/ 19 января 2014

На всякий случай, если кому-то придется сделать то же самое, что и я. Я должен был извлечь все в скобках в строке. Например, если у меня есть строка вроде «Президент США (Барак Обама) встретился с…» и я хочу получить только «Барак Обама», это решение:

regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'

т.е. вам нужно заблокировать скобки со знаком slash \. Хотя это проблема более регулярных выражений, чем Python.

Кроме того, в некоторых случаях вы можете увидеть символы 'r' перед определением регулярного выражения. Если префикса r нет, вам нужно использовать escape-символы, такие как в C. Здесь более подробно об этом.

0 голосов
/ 04 марта 2019
text = 'I want to find a string between two substrings'
left = 'find a '
right = 'between two'

print(text[text.index(left)+len(left):text.index(right)])

Дает

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

Вот решение без регулярных выражений, которое также учитывает сценарии, в которых первая подстрока содержит вторую подстроку. Эта функция найдет подстроку, только если второй маркер находится после первого маркера.

def find_substring(string, start, end):
    len_until_end_of_first_match = string.find(start) + len(start)
    after_start = string[len_until_end_of_first_match:]
    return string[string.find(start) + len(start):len_until_end_of_first_match + after_start.find(end)]
0 голосов
/ 07 декабря 2017

Один лайнер, который возвращает другую строку, если не было совпадения. Редактировать: улучшенная версия использует next функцию, замените "not-found" чем-то другим, если необходимо:

import re
res = next( (m.group(1) for m in [re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk" ),] if m), "not-found" )

Мой другой способ сделать это, менее оптимальный, использует регулярное выражение во второй раз, но все еще не нашел более короткий путь:

import re
res = ( ( re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk") or re.search("()","") ).group(1) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...