복붙노트

[PYTHON] 완전 일치를 반환하지 않습니까?

PYTHON

완전 일치를 반환하지 않습니까?

나는 "크기 = XXX;"와 같은 일련의 문자열을 포함하는 파일을 가지고 있습니다. 나는 처음으로 파이썬의 re 모듈을 시도하고 다음과 같은 행동에 의해 조금 신비 스럽다. 나는 정규 표현식에서 '또는'에 대한 파이프를 사용하면 반환되는 일치하는 비트 만 볼 수있다. 예 :

>>> myfile = open('testfile.txt','r').read()
>>> print re.findall('size=50;',myfile)
['size=50;', 'size=50;', 'size=50;', 'size=50;']
>>> print re.findall('size=51;',myfile)
['size=51;', 'size=51;', 'size=51;']
>>> print re.findall('size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']
>>> print re.findall(r'size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']

경기의 "크기 ="부분이 사라졌습니다. (그러나 검색에서 확실히 사용됩니다. 그렇지 않으면 더 많은 결과가 나타납니다). 내가 뭘 잘못하고 있죠?

해결법

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

    1.문제는 re.findall이 캡처 그룹 (즉, 괄호로 묶인 정규식의 부분)을 일치 시키려고하면 일치하는 문자열이 아니라 반환되는 그룹입니다.

    문제는 re.findall이 캡처 그룹 (즉, 괄호로 묶인 정규식의 부분)을 일치 시키려고하면 일치하는 문자열이 아니라 반환되는 그룹입니다.

    이 문제를 해결하는 한 가지 방법은 캡쳐되지 않은 그룹 (? :) 접두사를 사용하는 것입니다.

    >>> import re
    >>> s = 'size=50;size=51;'
    >>> re.findall('size=(?:50|51);', s)
    ['size=50;', 'size=51;']
    

    re.findall이 일치하려고하는 정규식이 아무것도 캡처하지 않으면 일치하는 문자열 전체를 반환합니다.

    이 특별한 경우에는 문자 클래스를 사용하는 것이 가장 간단한 옵션 일 수 있지만 비 캡처 그룹은보다 일반적인 솔루션을 제공합니다.

  2. ==============================

    2.정규 표현식에 괄호가 포함되어 있으면 내용을 그룹으로 캡처하여 findall ()의 동작을 변경하여 해당 그룹 만 반환합니다. 다음은 문서의 관련 섹션입니다.

    정규 표현식에 괄호가 포함되어 있으면 내용을 그룹으로 캡처하여 findall ()의 동작을 변경하여 해당 그룹 만 반환합니다. 다음은 문서의 관련 섹션입니다.

    이 동작을 방지하려면 캡처하지 않는 그룹을 사용할 수 있습니다.

    >>> print re.findall(r'size=(?:50|51);',myfile)
    ['size=51;', 'size=51;', 'size=51;', 'size=50;', 'size=50;', 'size=50;', 'size=50;']
    

    다시, 문서에서 :

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

    3.'크기 = (50 | 51);' 는 크기 = 50 또는 크기 = 51을 찾고 있지만 50 또는 51 부분 만 일치한다는 것을 의미합니다 (괄호에 유의하십시오). 따라서 기호 =를 반환하지 않습니다.

    '크기 = (50 | 51);' 는 크기 = 50 또는 크기 = 51을 찾고 있지만 50 또는 51 부분 만 일치한다는 것을 의미합니다 (괄호에 유의하십시오). 따라서 기호 =를 반환하지 않습니다.

    sign = return을 원하면 다음을 할 수 있습니다 :

    re.findall('(size=50|size=51);',myfile)
    
  4. ==============================

    4.나는 당신이 원하는 것이 () 대신에 []를 사용한다고 생각한다. [] 문자 세트를 나타내는 동안 ()은 그룹 일치를 나타냅니다. 다음과 같이 시도해보십시오.

    나는 당신이 원하는 것이 () 대신에 []를 사용한다고 생각한다. [] 문자 세트를 나타내는 동안 ()은 그룹 일치를 나타냅니다. 다음과 같이 시도해보십시오.

    print re.findall('size=5[01];', myfile)
    
  5. ==============================

    5.경우에 따라 비 포획 그룹이 적합하지 않습니다. 예를 들어, regex가 반복되는 단어를 감지하는 경우 (예 : python docs)

    경우에 따라 비 포획 그룹이 적합하지 않습니다. 예를 들어, regex가 반복되는 단어를 감지하는 경우 (예 : python docs)

    r'(\b\w+)\s+\1'
    

    이 상황에서 전체 일치를 사용할 수 있습니다.

    [groups[0] for groups in re.findall(r'((\b\w+)\s+\2)', text)]
    

    \ 1이 \ 2로 변경되었습니다.

  6. from https://stackoverflow.com/questions/18425386/re-findall-not-returning-full-match by cc-by-sa and MIT license