Python 正则表达式:直到但不包括组或组 简介

Python 正则表达式:直到但不包括组或组 简介,python,regex,regex-lookarounds,regex-group,Python,Regex,Regex Lookarounds,Regex Group,我想捕获从换行开始的每个文本块,然后是ID,直到-但不包括-,或者下一个ID,或者任何从新行开始并后跟大写字母的字符串 伪代码: IDENTIFIER = newline + 0-2 UPPERCASE + 2-4 DIGITS + 0-2 UPPERCASE + literal dot + 1-2 space (?P<id>IDENTIFIER)(?P<text>.*?)(?:(?!(ID|\n[A-Z]?)))

我想捕获从换行开始的每个文本块,然后是ID,直到-但不包括-,或者下一个ID,或者任何从新行开始并后跟大写字母的字符串

伪代码:

IDENTIFIER = newline + 0-2 UPPERCASE + 2-4 DIGITS + 0-2 UPPERCASE + literal dot + 1-2 space
(?P<id>IDENTIFIER)(?P<text>.*?)(?:(?!(ID|\n[A-Z]?)))
                              ^
                              |--- match until here
还有一段Python代码:

重新导入
regex_id=r“\n[A-Z]{0,2}[0-9]{2,4}[A-Z]{0,2}\.\{1,2}”
regex_until_但_not_include=lambda rgx:rf“(?:(?!{rgx})。”
regex_everything_non_greedy='.*?'
regex_or=lambda iterable:“(“+”|“.连接([f'({e})”表示iterable中的e])+”)
正则表达式模式=(
正则表达式id
+regex_一切非贪婪
+正则表达式直到但不包括(正则表达式id)
)
文本=“Lorem ipsum…\n130A。Lorem ipsum dolor sit amet,是一位杰出的职业经理人。\nQ133AR。Lorem ipsum dolor sit amet,是一位杰出的献身者\NLREM ipsum继续下一行,还需要捕获它\nS321V。Lorem ipsum dolor sit amet,是一位杰出的献身者\n一些我不想匹配的大写字母。\nN999B。Lorem ipsum dolor sit amet,奉献精英。”
芬德尔酒店(
模式=正则表达式模式,
字符串=文本,
flags=re.DOTALL
)
正则表达式扩展:

r“\n[A-Z]{0,2}[0-9]{2,4}[A-Z]{0,2}.\{1,2}.*(?:(?!\n[A-Z]{0,2}[0-9]{2,4}[A-Z]{0,2}.\{1,2})。”
电流输出
[
“公元130A年,奥勒姆·伊普苏姆·多洛尔·西特·阿梅特,献祭精英。”,
“Q133AR.Lorem ipsum dolor sit amet,Concertetur adipiscing Elite。\n Lorem ipsum继续下一行,也需要捕获它”,
“S321V.Lorem ipsum dolor sit amet,Concertetur adipiscing Elite.\n一些我不想匹配的文本内容。”,
“N999B.Lorem ipsum dolor sit amet,尊敬的精英。”,
]
预期产量
[
“公元130A年,奥勒姆·伊普苏姆·多洛尔·西特·阿梅特,献祭精英。”,
“Q133AR.Lorem ipsum dolor sit amet,Concertetur adipiscing Elite。\n Lorem ipsum继续下一行,也需要捕获它”,
“S321V.Lorem ipsum dolor sit amet,奉献精英。”
]
我试过什么 我希望通过以下方式修改我的代码:

regex_或=lambda iterable:'('+'|'。在iterable中为e连接([f'({e}'))+')”
正则表达式模式=(
正则表达式id
+regex_一切非贪婪
+正则表达式直到但不包括(
regex_或([regex_id,r'\n[A-Z]+']))
)
将产生正确的结果,但遗憾的是,它会产生一个空的3元素元组列表。

我建议使用

(?ms)^[A-Z]{0,2}[0-9]{2,4}[A-Z]{0,2}.{1,2}(?=.\n[^\r\na-zA-Z]*[A-Z][^\r\na-Z]*.*(?=\n[^\r\na-zA-Z]*[A-Z][^\r\na-Z]*.$[A-Z].[A-Z]{0,2,4}[A-Z].{

模式遵循以下方案:
^(?=.*):

重新导入
regex_id=r“[A-Z]{0,2}[0-9]{2,4}[A-Z]{0,2}\.{1,2}”
regex_uppercaseline=r“\n[^\r\na-zA-Z]*[A-Z][^\r\na-Z]*$”
regex_pattern=fr“^{regex_id}(?=.*{regex_uppercaseline})。*?(?={regex_uppercaseline}|\n{regex_id}|\Z)”
text=“Lorem ipsum…\n130A。Lorem ipsum dolor sit amet,是一位杰出的职业经理人。\nQ133AR。Lorem ipsum dolor sit amet,是一位杰出的献身者\NLREM ipsum继续下一行,还需要捕获它\nS321V。Lorem ipsum dolor sit amet,是一位杰出的献身者\n一些我不想匹配的大写字母。\nN999B。Lorem ipsum dolor sit amet,奉献精英。”
res=re.findall(regex_模式、文本、re.DOTALL | re.MULTILINE)
打印(res)
#=>['130A.洛雷姆·伊普苏姆·多洛·西特·阿梅特,奉献精英。”,
#“Q133AR.Lorem ipsum dolor sit amet,Concertetur adipiscing Elite。\n Lorem ipsum继续下一行,也需要捕获它”,
#“S321V.Lorem ipsum dolor sit amet,奉献精英。”
#    ]
另一种方法:

for s in re.sub(f'^[A-Z\s{string.punctuation}]*\n', '', text, flags=re.M).split('\n'):
    if re.match(r'^\w+\.\s+', s):
        l += [s]
    elif l:
        l[-1] = "\n".join([l[-1], s])
print(l)
结果:

['130A.  Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
 'Q133AR. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nLorem ipsum continues on next line, need to capture it as well ',
 'S321V.  Lorem ipsum dolor sit amet, consectetur adipiscing elit. ',
 'N999B.  Lorem ipsum dolor sit amet, consectetur adipiscing elit.']
如果我这次看的是正确的字段,这就是你想要的。我不确定我匹配的内容是否正确。但一般策略是删除所有大写(无数字)、标点符号和空格的行。然后,对于每一行,如果它以“word.(一个或多个空格)”开头,则将其附加到列表“l”中。如果不匹配,并且不是第一行,则将其加入列表“l”中的最后一项


我无法从您的描述中解释为什么最后一行没有包含在您想要的输出中。

这是个好主意,但是否可以用
N999B….的方式修改它不包括在结果中吗?我将其作为边缘大小写包含在内,其中短语matching
regex_id
出现在大写文本之后,由于它出现在大写文本之后,因此不应包含在结果中。在写这篇评论时,我意识到我可能需要为大写文本选择非捕获正向前瞻。。。但我仍然不知道如何“结束”正则表达式搜索时,它击中了那个模式。。。你能帮忙吗?移除
|\Z
就可以了(至少乍一看是这样),我还不明白why@Marcin
|\Z
允许匹配最后一个匹配项。如果不需要最后一个匹配项(在字符串末尾),则删除
|\Z
是一个有效的修复方法。编辑:在阅读了上面的评论后,我意识到这不是正确的解决方法。但真正的规则是什么呢?匹配应该在一个大写的行之后停止吗?广告编辑:是的。我很抱歉,整个问题和标题都编错了。。。真正的标题应该匹配X直到(不包括)下一个X,当遇到Y时停止匹配Altogator,其中
Y=\n[A-Z\s]*\n
X=regex\u id
@Marcin好的,您需要在第一个id模式后添加
(?=.\n[^\r\na-zA-Z]*[A-Z][^\r\na-Z]*$)
,请参见。
['130A.  Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
 'Q133AR. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nLorem ipsum continues on next line, need to capture it as well ',
 'S321V.  Lorem ipsum dolor sit amet, consectetur adipiscing elit. ',
 'N999B.  Lorem ipsum dolor sit amet, consectetur adipiscing elit.']