Python 多行内容的负环视正则表达式

Python Regex for Negative Lookaround for multiline content

我是 Python 的新手。我正在处理 LaTeX 文件,其中包含大量数学、编程代码等。我已将多个 space " +" 替换为 " "。但是我需要忽略我代码的某些部分。例如:

普通文本:"Hai, I am New to Python"。我已经用 "Hai, I am New to Python" 将 multi space 替换为单个 space。此正则表达式应用于整个文档。但我需要忽略某些 LaTeX 标签中的 multi space 。例如

Hai, I am    New to       Python
\begin{lstlisting}[title=Sample]
      print("Hai, I am    New to       Python")
      def Code(a):
          print(a)
      Code("Hai, i am new to Perl")
\end{lstlisting}

在我的代码 multi space 更改为 single space 之后 \begin{lstlisting}\end{lstlisting}

"Hai, I am New to Python"
\begin{lstlisting}[title=Sample]
 print("Hai, I am New to Python")
 def Code(a):
 print(a)
 Code("Hai, i am new to Perl")
\end{lstlisting}

如何忽略 \begin{lstlisting}\end{lstlisting} 之间的 python 正则表达式?

正确的 LaTeX 解析器是可行的方法,但这可能是 'good enough' 解决方案。看看你的想法。

import re

text = '''
Hai, I am    New to       Python
\begin{lstlisting}[title=Sample]
      print("Hai, I am    New to       Python")
      def Code(a):
          print(a)
      Code("Hai, i am new to Perl")
\end{lstlisting}
'''
  
text = re.sub(r' +(?!(?:(?!\begin\{lstlisting\}).)*\end\{lstlisting\})', ' ', text, flags=re.DOTALL)

print(text)

如果 \end{lstlisting} 出现在字符串前面而没有 \begin{lstlisting} 出现在它之前,它的工作原理是不替换空格。