문제
정규식을 사용하여 큰 텍스트 블록을 일치시키려고 하는데 여러 줄에 걸쳐 일치해야 합니다.
해결 방법
이 문제는 일반적으로 점(.)을 사용하여 문자와 일치하지만 점(.)이 개행 문자와 일치할 수 없다는 점을 잊어버릴 때 발생합니다. 예를 들어 C에서 분할된 주석을 일치시키려고 한다고 가정해 보겠습니다.
>>> comment = re.compile(r'/\*(.*?)\*/')<br/>>>> text1 = '/* this is a comment */'<br/>>>> text2 = '''/* this is a<br/>... multiline comment */<br/>... '''<br/>>>><br/>>>> comment.findall(text1)<br/>[' this is a comment ']<br/>>>> comment.findall(text2)<br/>[]<br/>>>><br/>
이 문제를 해결하려면 패턴 문자열을 수정하여 개행 지원을 추가할 수 있습니다. 예:
>>> comment = re.compile(r'/\*((?:.|\n)*?)\*/')<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>>>><br/>
이 패턴에서 (?:.|n)은 비캡처 그룹을 지정합니다(즉, 일치에만 사용되며 개별적으로 캡처하거나 번호를 매길 수 없는 그룹을 정의합니다).
Discussion
re.compile()
이 함수는 여기서 매우 유용한 re.DOTALL
라는 플래그 매개변수를 허용합니다. 정규식에서 개행 문자를 포함한 모든 문자와 일치하는 것을 허용합니다. 예: re.compile()
函数接受一个标志参数叫 re.DOTALL
,在这里非常有用。它可以让正则表达式中的.匹配包括换行符在内的任意字符。比如:
>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)<br/>>>> comment.findall(text2)<br/>[' this is a\n multiline comment ']<br/>
对于简单的情况使用 re.DOTALL
rrreee
re.DOTALL
태그 매개변수를 사용하면 간단한 경우에는 잘 작동하지만, 패턴이 매우 복잡하거나 여러 패턴이 결합되어 문자열 토큰을 구성하는 경우(섹션 2.18 자세한 설명) 일부 이 표시 매개변수를 사용할 때 문제가 발생할 수 있습니다. 선택할 수 있는 경우 추가 마커 매개변수 없이도 잘 작동하도록 고유한 정규식 패턴을 정의하는 것이 좋습니다. 추천 튜토리얼: "Python Tutorial
"🎜위 내용은 Python 여러 줄 일치 패턴 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!