Python正则表达式查找以A或B结尾的字符串,如果A位于第一位或B(非贪婪搜索)

Python正则表达式查找以A或B结尾的字符串,如果A位于第一位或B(非贪婪搜索),python,regex,Python,Regex,我有以下python代码 data=re.sub(“{.{4,9}b.*?[\r\n]*?.*((.\\\()|(…fs24))”,字符串,re.DOTALL) 我希望能够为下面的每个字符串提供两个匹配项 ?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24 及 在两者的两个排列中 ?{\f1\fs24\b \u1492 ?}\u1494 ?( ?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24 ?{\f1\fs24\b \u1510 ?}\u1489

我有以下python代码
data=re.sub(“{.{4,9}b.*?[\r\n]*?.*((.\\\()|(…fs24))”,字符串,re.DOTALL)

我希望能够为下面的每个字符串提供两个匹配项

?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24

在两者的两个排列中

?{\f1\fs24\b \u1492 ?}\u1494 ?(  ?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24
?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24 ?{\f1\fs24\b \u1492 ?}\u1494 ?(
但是,OR运算符是贪婪的。因此它总是尝试馈送第一个操作数,因此在这两种情况下,它都将消耗整个字符串,并且只给我一个匹配项

我花了一些时间去理解贪婪。。。 为了解决这个问题,我采用了积极的前瞻性假设。
我还试图进行两次单独的搜索,但贪婪总是赢的…

我不知道你到底想做什么,但是如果你想在第一次
.fs24
)停止,那么你需要使用一个否定的前瞻来检查每个
匹配是否匹配

data = re.search(r"{.{4,9}b .*?[\r\n]*?.*? ((?:(?!\(| ..fs24).)*)", string, re.DOTALL)
                                            ^^^^^^^^^^^^^^^^^^^^
如果要进行匹配,则需要
re.search
(或
re.findall
在一次呼叫中查找多个匹配项)。使用
re.sub
仍需要两个输入字符串

注:

  • Raw您的正则表达式字符串以避免双重转义元字符
  • *?[\r\n]*?*?*?
    :这部分对我来说似乎不太有用,但我把它放在那里了,因为我不知道除了在第一次
    .fs24
    停止之外,你还想做什么

对于最后一个字符串,您得到的是2个匹配项,而不是1个匹配项。

请澄清您的文本到底是什么,以及您希望正则表达式匹配什么。另外,您当前的正则表达式有不平衡的括号,因此根本不起作用。@jonrsharpe:括号不是不平衡的,请仔细看,其中一个括号已转义。@jonrsharpe:regex101不知道该模式不是原始字符串。@Casimirithippolyte啊,非原始regex字符串FTL.Jerry-我仍在试图准确理解它的作用。但是,我需要匹配fs24,只有当它的形式为@LouisShraga啊,我不知道这是一个要求。这就是为什么你需要澄清你的问题。只需在在
.fs24
.Jerry中重新显示两个点。*?[\r\n]*?.*?我希望能够跨多行匹配帐户,但re.DOTALL不起作用。添加后,多行搜索功能已丢失…请您提示我,还是我应该打开一个新问题?@LouisShraga如果您删除该部分并保留re.DOTALL,应该可以。我现在需要离开,没有时间再进行编辑我的答案。将返回abt 8 hrsJerry我发现了re.DOTALL的问题,我在位置上使用它,当切换到flags=re.DOTALL时,所有问题都解决了。谢谢!
data = re.search(r"{.{4,9}b .*?[\r\n]*?.*? ((?:(?!\(| ..fs24).)*)", string, re.DOTALL)
                                            ^^^^^^^^^^^^^^^^^^^^