Python 正则表达式:字符串出现次数最少的匹配模式

Python 正则表达式:字符串出现次数最少的匹配模式,python,regex,Python,Regex,我试图找到一种模式来匹配一个包含“::”0次或多次的字符串,但不能将任何字符串与单个“:”单独匹配 例如,如果我试图匹配的组是中的arg“调用者消息:arg”,并且arg类似于Class::method(),那么它应该匹配。我不想让它找到一个:“如果字符串是“caller message1:arg1 message2:arg2”,在这种情况下,我希望模式同时匹配arg1和arg2,但不要混淆arg1 message:arg2作为要匹配的字符串 因此,我有类似于[^\[\]\s:][+[:{2}]

我试图找到一种模式来匹配一个包含
“::”
0次或多次的字符串,但不能将任何字符串与单个
“:”
单独匹配

例如,如果我试图匹配的组是
中的
arg
“调用者消息:arg”
,并且
arg
类似于
Class::method()
,那么它应该匹配。我不想让它找到一个
:“
如果字符串是
“caller message1:arg1 message2:arg2”
,在这种情况下,我希望模式同时匹配
arg1
arg2
,但不要混淆
arg1 message:arg2
作为要匹配的字符串

因此,我有类似于
[^\[\]\s:][+[:{2}]+[^\[\]\s:][+\124;[^\[\]\ s:][+
的内容来匹配
arg
部分(该部分正在尝试查找0或1个
”:“
)。 很明显,我不是正则表达式专家(或者正则表达式专家(或者repert)),我很想知道这个通用版本会是什么样子。 也就是说,我需要什么正则表达式来搜索模式中不以任何部分形式出现的子字符串。因此,如果我正在查找
“string”
,那么
“s”
“st”
“str”
或从开头开始的
“string”
的任何子字符串(更通用的版本可能不允许任何子字符串)都不能出现在匹配中

上述正则表达式中的想法的问题在于它没有考虑到
:“
的多个实例,例如
“Class1::method1(Class2::method2())”

我正在为整个
问题寻找一个明确的答案:“
问题,但也可以用概括的形式回答

编辑:

tl;dr:我想在调用方消息中匹配
Class1::method1(Class2::method2())
,或者在
调用方消息中匹配
Class3::method3(Class4::method4())
之外的
Class1::method1(Class2::method2())消息2:Class3::method3(Class4::method4())
(单独)但是模式不能与
Class1::method1(Class2::method2())消息2:Class3::method3(Class4::method4())

编辑2:

为了澄清:模式必须匹配
“ab:C::D()”
字符串
C::D()
ab:C::D()E:F::G()“
中,字符串
C::D()
F::G()
,但不是
C::D()E:F::G()

我不认为我能更清楚地说明这个意图,以及为什么一个简单的
(找到我任何东西):(再找一次)
是不够的

编辑3:

另外,从技术上讲,每个
后面的部分可能有一个空格,比如
C::D(“一些文本”)
,这意味着我前面提到的正则表达式是不正确的,应该更像
[^\[\]:]+[:{2}]+[^\[\]:]+\\[^\[\]:]+\[^\[\]:]+

下面是一个真实世界(经过修改)的示例,我正在努力解决:

[层运行操作:序列::操作(actionScale,NULL)]
需要在完整模式中匹配
运行操作
序列::操作(actionScale,NULL)

这是:

[序列操作:DelayTime::create(1.0),CallFunc::create(此,选择器(分解单元格)),NULL]
必须匹配
序列
操作
DelayTime::create(1.0)…,NULL

这是:

[Analytics reportEvent:GENERAL\u EVENT usingID:getCurrentID()with Parameter:Number::numberWithFloat(Number::defaultNumber()+1)]
必须匹配
Analytics
reportEvent
GENERAL\u EVENT
usingID
(可以忽略,但为简单起见,也可以匹配),
getCurrentID()
带参数
(也可以忽略),
Number::numberWithFloat(Number::defaultNumber()+1)

编辑4:


我更改了EDIT3中的最后一个示例,以反映我试图实现的最终目标。如果您试图匹配只能包含
但不能包含
的字符串,请尝试以下操作:

([^:]|::)*
通用版本非常简单。每个前缀都以第一个字符开头,因此除非完全匹配,否则不允许这样做:

([^s]|string)*

我不太确定你在找什么,但以下是我的想法:


如果您的示例是准确的,最简单的方法就是使用后期修复来识别参数

正则表达式很简单

message\d*:\s*(\S+)
不知道这是否对你有帮助,但是

问候

编辑:

好的-我们又来了:)这应该可以帮你

\w+:\s*(.*?)(?=$|]|\s*\w+:(?:\w|\s))

如果没有-你的例子和说明不够清楚(至少对我来说;)

说明:
它匹配后跟冒号的单词字符,并抓取后面的所有内容,最多1.行尾,2.右括号或3.新的单词字符序列后跟一个冒号。

@anubhava我在玩regex101.com,具体地说,我正试图使用python让它工作。reYou的问题相当详细和混乱。你能用你期望的粘贴一个输入和输出吗?添加一些示例案例,你想要执行的匹配等等…………为什么?你的示例仍然不清楚。是的,但这将接受
之前和之后的任何内容,包括单个
,这不是我想要的。@ClasG,这是一个问题原因?它包含
,但是没有一个
@itchy23更新了我的答案。哈哈,这很可爱:)我没有寻找消息\d。我认为\w已经足够了。问题还在于
后面可能有一个空格,比如
a::B(“一些文本”)
。我将把这一点添加到问题中。编辑看起来不错。我将插入它并进行测试,如果有效,将其标记为答案:)
\w+:\s*(.*?)(?=$|]|\s*\w+:(?:\w|\s))