복붙노트

[PYTHON] 두 마커 사이에서 부분 문자열을 추출하는 방법은 무엇입니까?

PYTHON

두 마커 사이에서 부분 문자열을 추출하는 방법은 무엇입니까?

문자열 'gfgfdAAA1234ZZZuijjk'가 있고 '1234'부분 만 추출하려고한다고 가정 해 봅시다.

나는 AAA 직전에 몇 인물이 될 것인지, ZZZ 이후에는 1234에 관심이있는 부분을 알 수 있습니다.

sed를 사용하면 다음과 같이 문자열로 처리 할 수 ​​있습니다.

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

그리고 이것은 1234를 결과로 줄 것입니다.

파이썬에서 같은 일을하는 방법?

해결법

  1. ==============================

    1.정규 표현식 사용 - 추가 참조 용 문서

    정규 표현식 사용 - 추가 참조 용 문서

    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
    
  2. ==============================

    2.

    >>> s = 'gfgfdAAA1234ZZZuijjk'
    >>> start = s.find('AAA') + 3
    >>> end = s.find('ZZZ', start)
    >>> s[start:end]
    '1234'
    

    원하는 경우 re 모듈과 regexps를 함께 사용할 수 있지만 필요하지는 않습니다.

  3. ==============================

    3.

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

    your_text에 "AAA"및 "ZZZ"가 없으면 위의 속성은 AttributeError와 함께 실패합니다.

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

    your_text에 "AAA"또는 "ZZZ"가 없으면 위의 코드는 빈 문자열을 반환합니다.

    PS 파이썬 챌린지?

  4. ==============================

    4.

    import re
    print re.search('AAA(.*?)ZZZ', 'gfgfdAAA1234ZZZuijjk').group(1)
    
  5. ==============================

    5.그것을 위해 re 모듈을 사용할 수 있습니다 :

    그것을 위해 re 모듈을 사용할 수 있습니다 :

    >>> import re
    >>> re.compile(".*AAA(.*)ZZZ.*").match("gfgfdAAA1234ZZZuijjk").groups()
    ('1234,)
    
  6. ==============================

    6."$ 문자열"| 슬픈 -A "s.. *이 \ (. *) * Zhz. * | \ 1 |"

    "$ 문자열"| 슬픈 -A "s.. *이 \ (. *) * Zhz. * | \ 1 |"

    동일한 정규식을 사용하여 re.sub 함수를 사용하여 동일한 작업을 수행 할 수 있습니다.

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

    기본 sed에서 캡쳐 그룹은 \ (.. \)로 표시되지만, 파이썬에서는 (..)로 표시됩니다.

  7. ==============================

    7.

    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]))
    
  8. ==============================

    8.단지 누군가가 내가 한 것과 똑같은 일을해야 할 것입니다. 한 줄에 괄호 안에있는 모든 것을 추출해야했습니다. 예를 들어, '미국 대통령 (버락 오바마)이 만난 선 ...'이 있고 '버락 오바마'만 얻고 싶다면 해결책입니다.

    단지 누군가가 내가 한 것과 똑같은 일을해야 할 것입니다. 한 줄에 괄호 안에있는 모든 것을 추출해야했습니다. 예를 들어, '미국 대통령 (버락 오바마)이 만난 선 ...'이 있고 '버락 오바마'만 얻고 싶다면 해결책입니다.

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

    나는. 슬래시 기호를 사용하여 괄호를 차단해야합니다. 파이썬이 더 많은 정규 표현식에 대해 문제가 되긴하지만.

    또한 어떤 경우에는 정규 표현식 정의 앞에 'r'기호가 표시 될 수 있습니다. r 접두사가 없으면 C와 같은 이스케이프 문자를 사용해야합니다. 여기에 대한 자세한 설명이 있습니다.

  9. ==============================

    9.한 줄의 코드 만 사용하면됩니다.

    한 줄의 코드 만 사용하면됩니다.

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

    결과는 목록을받을 것이다 ...

  10. ==============================

    10.

    >>> s = '/tmp/10508.constantstring'
    >>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')
    
  11. ==============================

    11.파이썬에서 string에서 부분 문자열을 추출하는 것은 정규 표현식 (re) 모듈에서 findall 메소드를 사용하여 수행 할 수 있습니다.

    파이썬에서 string에서 부분 문자열을 추출하는 것은 정규 표현식 (re) 모듈에서 findall 메소드를 사용하여 수행 할 수 있습니다.

    >>> import re
    >>> s = 'gfgfdAAA1234ZZZuijjk'
    >>> ss = re.findall('AAA(.+)ZZZ', s)
    >>> print ss
    ['1234']
    
  12. ==============================

    12.일치하는 것이 없을 경우 다른 문자열을 반환하는 라이너 하나. 편집 : 개선 된 버전은 다음 함수를 사용하고, "찾지 못함"을 필요한 경우 다른 것으로 바꿉니다.

    일치하는 것이 없을 경우 다른 문자열을 반환하는 라이너 하나. 편집 : 개선 된 버전은 다음 함수를 사용하고, "찾지 못함"을 필요한 경우 다른 것으로 바꿉니다.

    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) )
    
  13. from https://stackoverflow.com/questions/4666973/how-to-extract-the-substring-between-two-markers by cc-by-sa and MIT license