"Python用于查找以A或B结尾的字符串的正则表达式,无论A是否排在前面或B (非贪婪搜索)"

2024-09-27 21:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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操作符是贪婪的。所以它总是尝试输入第一个操作数,所以在这两种情况下,它都会消耗整个字符串,只给我一个匹配项。。。你知道吗

我花了一些时间才明白贪婪。。。 为了解决这个问题,我在玩积极的前瞻性假设。 我也试着做两个单独的搜索,但贪婪总是赢。。。你知道吗


Tags: or字符串代码redatastring情况f1
1条回答
网友
1楼 · 发布于 2024-09-27 21:24:10

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

data = re.search(r"{.{4,9}b .*?[\r\n]*?.*? ((?:(?!\(| ..fs24).)*)", string, re.DOTALL)
                                            ^^^^^^^^^^^^^^^^^^^^

如果你正在匹配,你需要re.search(或者re.findall来匹配一个whoop中的多个匹配)。使用re.sub时,您仍然需要两个输入字符串。你知道吗

注意事项:

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

regex demo对于最后一个字符串,您将得到2个匹配项,而不是1个。你知道吗

相关问题 更多 >

    热门问题