我有以下python代码
data = re.sub("{.{4,9}b .*?[\r\n]*?.*? ((.*\\()|(..fs24))",string,re.DOTALL)
我希望能够为下面的每个字符串设置两个匹配项
?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24
和
?{\f1\fs24\b \u1492 ?}\u1494 ?(
两者的排列
?{\f1\fs24\b \u1492 ?}\u1494 ?( ?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24
?{\f1\fs24\b \u1510 ?}\u1489 ?\fs24 ?{\f1\fs24\b \u1492 ?}\u1494 ?(
然而,OR运算符是贪婪的。因此它总是会尝试提供第一个操作数,所以在这两种情况下它都会消耗整个字符串并只给我一个匹配...
我花了一些时间来理解贪婪...... 为了解决我正在采取积极的前瞻假设。 我也试图进行两次单独的搜索,但贪婪总是赢得......
答案 0 :(得分:1)
我不知道你正在尝试做什么,但如果你想在第一个(
或..fs24
停下来,那么你需要使用否定的先行检查每个.
匹配是否匹配。
data = re.search(r"{.{4,9}b .*?[\r\n]*?.*? ((?:(?!\(| ..fs24).)*)", string, re.DOTALL)
^^^^^^^^^^^^^^^^^^^^
如果您要进行匹配,则您需要re.search
(或re.findall
进行多次匹配。)无论如何,您都需要re.sub
。
注意:
.*?[\r\n]*?.*?
:这部分对我来说似乎没什么用处,但我把它留在那里因为我不知道你在第一次停留时做了什么。 {1}}或.*?[\r\n]*?.*?
。regex demo表示获得2场比赛而不是1场的最后一个字符串。