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

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

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

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

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

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

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

Ответы [ 15 ]

451 голосов
/ 12 января 2011

Использование регулярных выражений - документация для дальнейшего использования

import re

text = 'gfgfdAAA1234ZZZuijjk'

m = re.search('AAA(.+?)ZZZ', text)
if m:
    found = m.group(1)

# found: 1234

или

import re

text = 'gfgfdAAA1234ZZZuijjk'

try:
    found = re.search('AAA(.+?)ZZZ', text).group(1)
except AttributeError:
    # AAA, ZZZ not found in the original string
    found = '' # apply your error handling

# found: 1234
95 голосов
/ 12 января 2011
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> start = s.find('AAA') + 3
>>> end = s.find('ZZZ', start)
>>> s[start:end]
'1234'

Тогда вы можете использовать регулярные выражения и с модулем re, если хотите, но это не обязательно в вашем случае.

44 голосов
/ 07 февраля 2011

регулярное выражение

import re

re.search(r"(?<=AAA).*?(?=ZZZ)", your_text).group(0)

Приведенное выше как есть не удастся с AttributeError, если в your_text

строковых методах * нет "AAA" и "ZZZ"

your_text.partition("AAA")[2].partition("ZZZ")[0]

Вышеприведенное вернет пустую строку, если в your_text.

PS Python Challenge?

не существует ни "AAA", ни "ZZZ"?
13 голосов
/ 12 января 2011
import re
print re.search('AAA(.*?)ZZZ', 'gfgfdAAA1234ZZZuijjk').group(1)
7 голосов
/ 12 января 2011

Для этого вы можете использовать re модуль:

>>> import re
>>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
('1234,)
6 голосов
/ 11 января 2018

вы можете сделать, используя только одну строку кода

>>> import re

>>> re.findall(r'\d{1,5}','gfgfdAAA1234ZZZuijjk')

>>> ['1234']

результат получит список ...

5 голосов
/ 31 января 2015

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

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

И это даст мне 1234.

Вы можете сделать то же самое с функцией re.sub, используя то же регулярное выражение.

>>> re.sub(r'.*AAA(.*)ZZZ.*', r'\1', 'gfgfdAAA1234ZZZuijjk')
'1234'

В базовом sed группа захвата представлена ​​\(..\), но в python она была представлена ​​(..).

4 голосов
/ 09 февраля 2019

Удивлен, что никто не упомянул об этом, это моя быстрая версия для одноразовых скриптов:

>>> x = 'gfgfdAAA1234ZZZuijjk'
>>> x.split('AAA')[1].split('ZZZ')[0]
'1234'
4 голосов
/ 14 октября 2017

Вы можете найти первую подстроку с этой функцией в вашем коде (по индексу символов). Также вы можете найти то, что находится после подстроки.

def FindSubString(strText, strSubString, Offset=None):
    try:
        Start = strText.find(strSubString)
        if Start == -1:
            return -1 # Not Found
        else:
            if Offset == None:
                Result = strText[Start+len(strSubString):]
            elif Offset == 0:
                return Start
            else:
                AfterSubString = Start+len(strSubString)
                Result = strText[AfterSubString:AfterSubString + int(Offset)]
            return Result
    except:
        return -1

# Example:

Text = "Thanks for contributing an answer to Stack Overflow!"
subText = "to"

print("Start of first substring in a text:")
start = FindSubString(Text, subText, 0)
print(start); print("")

print("Exact substring in a text:")
print(Text[start:start+len(subText)]); print("")

print("What is after substring \"%s\"?" %(subText))
print(FindSubString(Text, subText))

# Your answer:

Text = "gfgfdAAA1234ZZZuijjk"
subText1 = "AAA"
subText2 = "ZZZ"

AfterText1 = FindSubString(Text, subText1, 0) + len(subText1)
BeforText2 = FindSubString(Text, subText2, 0) 

print("\nYour answer:\n%s" %(Text[AfterText1:BeforText2]))
3 голосов
/ 14 марта 2018

В Python извлечение строки формы подстроки можно выполнить с помощью метода findall в модуле регулярного выражения (re).

>>> import re
>>> s = 'gfgfdAAA1234ZZZuijjk'
>>> ss = re.findall('AAA(.+)ZZZ', s)
>>> print ss
['1234']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...