\ @를 사용하여 부정 된 패턴을 반복 할 수 없습니다!

Aug 21 2020

이 텍스트가 있습니다.

```파이썬
x = 1
```

기본적으로 파이썬 셀을 마크 다운합니다. 커서를 둘러싼 셀의 내용을 추출하고 싶습니다.

이미 짐작 하셨겠지만, 저는 jupyter 워크 플로우를 구축하려고하고 , 콘솔에 jupytex 와 vim-slime를 사용하고, 콘솔에 셀을 보내고 싶습니다.

현재 저는 정규식과 셀을 일치시키는 데 어려움을 겪고 있습니다.

/```python\(\(```\)\@!\)*```

이것은```python으로 시작하는 문자열과 일치해야하고, 삼중 따옴표를 제외한 모든 것, 그리고 삼중 따옴표와 일치해야하지만 그렇지 않습니다.

이상하게도 이것은 (끝 세 개의 따옴표없이 :

/```python\(\(```\)\@!\)*

```python을 강조하지만 더 이상은 없습니다.

그렇다면 파이썬 셀과 일치하는 정규식은 무엇입니까? 커서 아래에있는 셀의 내용과 일치하는 정규식에 대한 보너스!

답변

4 user938271 Aug 21 2020 at 03:18

이것은```python으로 시작하는 문자열과 일치해야하고, 삼중 따옴표를 제외한 모든 것, 그리고 삼중 따옴표와 일치해야하지만 그렇지 않습니다.

*멀티가 어떤 문자도 반복하지 않기 때문입니다 . 전체 일치에 아무것도 추가하지 않는 부정적인 예측을 반복합니다. 정규식 엔진은 닫는 삼중 백틱에 도달 할 수 없습니다.

/```python\(\(```\)\@!\)*```
            ^--------^
                ✘

내부에 문자 추가 :

/```python\(\(```\)\@!\_.\)*```
                      ^-^

그 주 \_.줄 바꿈을 포함한 모든 문자를 일치시킬 수 있습니다; 반대로 .개행과 일치 할 수 없습니다. 을 참조하십시오 :h /\_.


그렇다면 파이썬 셀과 일치하는 정규식은 무엇입니까? 커서 아래에있는 셀의 내용과 일치하는 정규식에 대한 보너스!

이 시도:

```python\n\%(\%(```\)\@!\_.\)*\%#\_.\{-}\n```\n
                               ├─┘   ├──┘
                               │     └ as few as possible
                               └ the cursor position must match here

:h /\%#및을 참조하십시오 :h /\{-.

4 Quasímodo Aug 21 2020 at 03:27

나는 그 고급 정규식을 이해하지 못하지만 이것은해야합니다.

^```python\_$\_.\{-}\_^```$

그것을 이해하려면 다음을 :help ordinary_atom안내하십시오.

  • \_$ 줄 끝과 일치합니다.
  • \_. 줄 끝을 포함하여 모든 문자와 일치합니다.
  • \_^ 줄 시작과 일치합니다.

그리고 :help non-greedy,

  • \{-}와 동일 *하지만 최단 일치 우선 알고리즘을 사용합니다. \_.우리의 경우 이전 요소에만 적용된다는 것을 기억하십시오 .

정규식을 약간 완화하여 ^$고정을 제거 할 수 있습니다.

이 샘플에서 테스트 한 정규식은 파이썬 셀과 만 일치합니다.

This is Python:
```python
for i in range(10):
    print(i)
```
This is FORTRAN:
```fortran
DO I=1,10
    WRITE(*,*)I
ENDDO
```
This is Python again
```python
for i in range(10):
print('```')
```