RegEx:匹配模式,最少出现一个字符串

时间:2015-11-12 12:52:02

标签: python regex

我试图提出一种模式来匹配包含"::" 0次或更多次的字符串但不匹配任何字符串本身只有一个":"

例如,如果我尝试匹配的小组arg "caller message: arg"arg类似Class::method(),那么它应匹配。如果字符串为":",我不希望它找到一个"caller message1: arg1 message2: arg2",在这种情况下,我希望模式匹配arg1和{{1}但不要将arg2混淆为要匹配的字符串。

所以我有类似arg1 message: arg2的内容来匹配[^\[\]\s:]+[:{2}]+[^\[\]\s:]+|[^\[\]\s:]+部分(试图找到0或1次出现的arg)。 很明显,我没有正则表达式专家(或regexpert(或repert);)),我很想知道这可能是什么样的通用版本。 也就是说,我需要什么样的正则表达式来搜索在模式中不以任何部分形式出现的子字符串。因此,如果我正在寻找"::",那么"string""s""st"或从"str"开始的任何子字符串(更多)广义版本可以禁止任何子字符串)不能出现在匹配中。

上述正则表达式中的想法存在的问题是,它没有考虑"string"中的"::"的多个实例。

我正在寻找专门针对整个"Class1::method1(Class2::method2())"问题的答案,但也可以以一般化的形式回答。

编辑:

tl; dr:我想匹配":"中的Class1::method1(Class2::method2())或与caller message: Class1::method1(Class2::method2())Class3::method3(Class4::method4())的{​​{1}}匹配(单独),但模式不得匹配caller message1: Class1::method1(Class2::method2()) message2: Class3::method3(Class4::message4())

EDIT2:

澄清:模式必须与Class1::method1(Class2::method2()) message2: Class3::method3(Class4::method4())字符串"A B: C::D()"匹配 在C::D()字符串中A B: C::D() E: F::G()"C::D(),而不是F::G()

我不认为我可以更清楚地了解其意图以及为什么简单C::D() E: F::G()不足。

EDIT3:

此外,在每个(find me anything)::(anything again) :之后,部件中可能存在空格,这意味着我前面提到的正则表达式不正确,应该更像C::D("some text")

这是一个真实世界(修改过)的例子,我正在努力:

[^\[\]:]+[:{2}]+[^\[\]:]+|[^\[\]:]+ 需要在完整模式中匹配[layer runAction: Sequence::actions(actionScale, NULL)]layerrunAction

而且:

Sequence::actions(actionScale, NULL)必须与[Sequence actions: DelayTime::create(1.0), CallFunc::create(this, selector(explodeCells)), NULL]Sequenceactions匹配

而且:

DelayTime::create(1.0)..., NULL必须与[Analytics reportEvent: GENERAL_EVENT usingID: getCurrentID() withParameter: Number::numberWithFloat(Number::defaultNumber() + 1)]AnalyticsreportEventGENERAL_EVENT匹配(可以忽略,但为了简单起见,也可以匹配),{{ 1}},usingID(也可以忽略),getCurrentID()

EDIT4:

我改变了EDIT3中的最后一个例子,以反映我试图实现的最终目标。这是DEMO

3 个答案:

答案 0 :(得分:2)

我不确定你在寻找什么,但这是我提出的: DEMO

(\S+::\S+\))

答案 1 :(得分:1)

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

See this regex101

正则表达式只是

message\d*:\s*(\S+)

Dunno如果这对你有帮助,但是......

此致

编辑:

好的 - 我们再来一次:)这应该为你做...

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

regex101 example

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

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

答案 2 :(得分:-1)

如果您尝试匹配只能包含::但不包含:的字符串,请尝试以下操作:

([^:]|::)*

通用版本非常简单。每个前缀都以第一个字符开头,因此除非它是完全匹配,否则不允许使用:

([^s]|string)*