Как извлечь подстроку из строки в Python?

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

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

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

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

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

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

вопрос задан 12.01.2011
miernik
1626 репутация

12 ответов


  • 356 рейтинг

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

    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
    
    ответ дан eumiro, с репутацией 120678, 12.01.2011
  • 82 рейтинг
    >>> s = 'gfgfdAAA1234ZZZuijjk'
    >>> start = s.find('AAA') + 3
    >>> end = s.find('ZZZ', start)
    >>> s[start:end]
    '1234'
    

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

    ответ дан Lennart Regebro, с репутацией 105264, 12.01.2011
  • 30 рейтинг

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

    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 ​​не существует ни «AAA», ни «ZZZ».

    PS Python Challenge?

    ответ дан tzot, с репутацией 61461, 6.02.2011
  • 13 рейтинг
    import re
    print re.search('AAA(.*?)ZZZ', 'gfgfdAAA1234ZZZuijjk').group(1)
    
    ответ дан infrared, с репутацией 2356, 12.01.2011
  • 6 рейтинг

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

    >>> import re
    >>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
    ('1234,)
    
    ответ дан andreypopp, с репутацией 4829, 12.01.2011
  • 5 рейтинг

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

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

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

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

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

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

    ответ дан Avinash Raj, с репутацией 139911, 31.01.2015
  • 4 рейтинг

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

    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]))
    
    ответ дан Saeed Zahedian Abroodi, с репутацией 101, 14.10.2017
  • 2 рейтинг

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

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

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

    ответ дан mahesh gupta, с репутацией 107, 11.01.2018
  • 2 рейтинг

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

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

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

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

    ответ дан wzbozon, с репутацией 7950, 19.01.2014
  • 1 рейтинг
    >>> s = '/tmp/10508.constantstring'
    >>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')
    
    ответ дан user1810100, с репутацией 13, 8.02.2014
  • 0 рейтинг

    Один вкладыш, который возвращает другую строку, если не было совпадения. Изменить: улучшенная версия использует функцию 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) )
    
    ответ дан MaxLZ, с репутацией 21, 7.12.2017
  • 0 рейтинг

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

    >>> import re
    >>> s = 'gfgfdAAA1234ZZZuijjk'
    >>> ss = re.findall('AAA(.+)ZZZ', s)
    >>> print ss
    ['1234']
    
    ответ дан rashok, с репутацией 5800, 14.03.2018