복붙노트

[PYTHON] 두 문자열 사이의 정규식 일치?

PYTHON

두 문자열 사이의 정규식 일치?

다음 예제처럼 모든 주석을 추출 할 수있는 방법을 찾지 못하는 것 같습니다.

>>> import re
>>> string = '''
... <!-- one 
... -->
... <!-- two -- -- -->
... <!-- three -->
... '''
>>> m = re.findall ( '<!--([^\(-->)]+)-->', string, re.MULTILINE)
>>> m
[' one \n', ' three ']

2와 블록 - 나쁜 정규 표현식 때문에 가장 가능성이 일치하지 않습니다. 누군가가 올바른 방향으로 두 문자열 사이의 일치하는 항목을 추출하는 방법을 알려주십시오 수 있습니다.

안녕하세요. 의견에서 제안하신 내용을 테스트 해 보았습니다.

>>> m = re.findall ( '<!--(.*?)-->', string, re.MULTILINE)
>>> m
[' two -- -- ', ' three ']
>>> m = re.findall ( '<!--(.*\n?)-->', string, re.MULTILINE)
>>> m
[' one \n', ' two -- -- ', ' three ']

감사!

해결법

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

    1.이 트릭을해야한다.

    이 트릭을해야한다.

     m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
    
  2. ==============================

    2.일반적으로 정규 문법으로 두 구분자간에 임의의 일치를 수행하는 것은 불가능합니다.

    일반적으로 정규 문법으로 두 구분자간에 임의의 일치를 수행하는 것은 불가능합니다.

    특히, 중첩을 허용하는 경우,

    <!-- how do you deal <!-- with nested --> comments? -->
    

    문제를 해결할 수 있습니다. 따라서 정규 표현식으로이 특정 문제를 해결할 수는 있지만 작성한 정규식은 다른 이상한 중첩 주석에 의해 손상 될 수 있습니다.

    임의의 주석을 구문 분석하려면 컨텍스트가없는 문법을 파싱하는 방법으로 이동해야합니다. 이렇게하는 간단한 방법은 푸시 다운 오토 마톤을 사용하는 것입니다.

  3. from https://stackoverflow.com/questions/12736074/regex-matching-between-two-strings by cc-by-sa and MIT license