Python正则表达式,用于查找以A OR B结尾的字符串,如果A首先出现,或者是B(非贪婪搜索)

时间:2014-08-02 19:16:21

标签: python regex

我有以下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运算符是贪婪的。因此它总是会尝试提供第一个操作数,所以在这两种情况下它都会消耗整个字符串并只给我一个匹配...

我花了一些时间来理解贪婪...... 为了解决我正在采取积极的前瞻假设。 我也试图进行两次单独的搜索,但贪婪总是赢得......

1 个答案:

答案 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场的最后一个字符串。