Python 如何不匹配不包含两个连续换行符的字符串

Python 如何不匹配不包含两个连续换行符的字符串,python,regex,Python,Regex,演示在。我有以下文本文件(bibtex.bbl文件): 如果我知道命令末尾的参考代码,我想将整个\bibitem命令与单个条目(带有一些捕获组)匹配。我使用这个正则表达式,它适用于第一个条目,但不适用于其余条目(第二个条目如下所示): 这不起作用,因为它匹配从第一个\bibitem命令开始到第二个\bibibitem命令结束的所有内容。如何仅匹配第二个\bibitem命令?我曾尝试对^$和\n\n使用负前瞻,但两种方法都无法使用-基本上,我希望第三个(.*)匹配任何不包括两个连续换行符的字符串。

演示在。我有以下文本文件(bibtex.bbl文件):

如果我知道命令末尾的参考代码,我想将整个
\bibitem
命令与单个条目(带有一些捕获组)匹配。我使用这个正则表达式,它适用于第一个条目,但不适用于其余条目(第二个条目如下所示):


这不起作用,因为它匹配从第一个
\bibitem
命令开始到第二个
\bibibitem
命令结束的所有内容。如何仅匹配第二个
\bibitem
命令?我曾尝试对
^$
\n\n
使用负前瞻,但两种方法都无法使用-基本上,我希望第三个
(.*)
匹配任何不包括两个连续换行符的字符串。(如果有其他方法,我洗耳恭听。)

正则表达式不是我的强项,但这将获得您想要的所有内容,而无需立即将所有内容读入内存:

from itertools import groupby
import re
with open("file.txt") as f:
    r = re.compile(r"\[{(.*?)\((.*?)\)(.*?)}\]\{alfonsi2011gsa\}")
    for k, v in groupby(map(str.strip, f), key=lambda x: bool(x.strip())):
        match = r.search("".join(v))
        if match:
             print(match.groups())


('\\textit{Alfonsi et~al.}', '2011{\\natexlab{b}}', '\\textit{Alfonsi, Spogli,Tong, De~Franceschi, Romano, Bourdillon, Le~Huy, andMitchell}')  

您可以使用负环视(
?!
)来防止匹配多次出现“bibitem”。这样,匹配将以“bibitem”开始,它紧跟在您的参考代码之前。这似乎有效:

\\bibitem\[{(((?!bibitem).)*?)\((((?!bibitem).)*?)\)(((?!bibitem).)*?)}\]{alfonsi2011gsa}

为什么不按新线分开?不完全确定你的意思。您是否建议对“\n\n”进行拆分并对每个项目执行正则表达式?是的,即使这样会更贵。是的,这是可能的。如果可能的话,我想要一个正则表达式,但是(由于与我正在制作的内容相关的各种原因,这是一个很长的故事)我不确定我是否完全理解它,但是使用re.DOTALL可能吗
\u re\u bibibitem=re.compile(r“(\\bibibitem(.*))\n\n”,re.DOTALL | re.MULTILINE)
(注意非贪婪修饰符)谢谢!这就是我最后使用的:
\\bibitem\[{((?:(?!^$)*?)\((?:(?!^$)*?)\)((?:(?!^$))*?)}\]{alfonsi2011gsa}
(flags
ms
)。我现在明白了,我的错误是只在其中一个组中使用了负面环视。这应该是在所有这些中,因为它们中的任何一个都足以包含新行。我还从您的正则表达式中删除了一些额外的捕获组,并将
bibibitem
更改为
^$
(因此,如果任何名称包含
bibibitem
,它仍然可以工作)。
from itertools import groupby
import re
with open("file.txt") as f:
    r = re.compile(r"\[{(.*?)\((.*?)\)(.*?)}\]\{alfonsi2011gsa\}")
    for k, v in groupby(map(str.strip, f), key=lambda x: bool(x.strip())):
        match = r.search("".join(v))
        if match:
             print(match.groups())


('\\textit{Alfonsi et~al.}', '2011{\\natexlab{b}}', '\\textit{Alfonsi, Spogli,Tong, De~Franceschi, Romano, Bourdillon, Le~Huy, andMitchell}')  
\\bibitem\[{(((?!bibitem).)*?)\((((?!bibitem).)*?)\)(((?!bibitem).)*?)}\]{alfonsi2011gsa}