正则表达式:当字符串包含正则表达式模式的一部分时匹配字符串的部分

时间:2009-01-29 07:21:54

标签: python regex

我希望通过使用正则表达式来减少我必须编写的模式数量,该正则表达式会在字符串中显示任何或所有模式。

Regex有可能吗?

E.g. Pattern is: "the cat sat on the mat"

I would like pattern to match on following strings:
"the"
"the cat"
"the cat sat"
...
"the cat sat on the mat"

但它不应匹配以下字符串,因为尽管某些单词匹配,但它们被不匹配的单词拆分:     “狗坐着”

4 个答案:

答案 0 :(得分:7)

此:

the( cat( sat( on( the( mat)?)?)?)?)?

会回答你的问题。删除“可选组”parens“(...)?”对于非可选的部分,请为必须匹配的内容添加其他组。

the                       // complete match
the cat                   // complete match
the cat sat               // complete match
the cat sat on            // complete match
the cat sat on the        // complete match
the cat sat on the mat    // complete match
the dog sat on the mat    // two partial matches ("the")

你可能想要添加一些前置条件,比如行锚的起点,以防止表达式匹配最后一行中的第二个“the”:

^the( cat( sat( on( the( mat)?)?)?)?)?

编辑:如果您添加后置条件,例如行结束锚点,则会在最后一个示例中完全阻止匹配,也就是说,最后一个示例将不匹配所有:

the( cat( sat( on( the( mat)?)?)?)?)?$

提示的积分转到VonC。谢谢!

后置条件当然可能是你期望跟随比赛的其他事情。

或者,您删除最后一个问号:

the( cat( sat( on( the( mat)?)?)?)?)

请注意:这会使单个“the”不匹配,因此第一行也不匹配。

答案 1 :(得分:2)

这可能相当复杂:

(?ms)the(?=(\s+cat)|[\r\n]+)(:?\s+cat(?=(\s+sat)|[\r\n]+))?(:?\s+sat(?=(\s+on)|[\r\n]+))?(:?\s+on(?=(\s+the)|[\r\n]+))?(:?\s+the(?=(\s+mat)|[\r\n]+))?(:?\s+mat)?[\r\n]+

含义:

  • 只有在后跟“the”或行尾
  • 时才需要“cat
  • 然后我想要“cat”(可选)只有后面跟着“sat
  • 等一个
  • 后跟和行尾(确保不匹配部分“猫行走......”)

匹配

猫坐在垫子上

猫坐
猫坐在垫子上(也没有任何匹配)
狗坐着(没有匹配)


第二个想法,Tomalak's answer更简单(如果修复,则以'$'结尾)。
我把我作为一个维基帖。

答案 2 :(得分:1)

如果你知道匹配总是从第一个字符开始,那么在循环中直接匹配字符要快得多。我不认为Regex会这样做。

答案 3 :(得分:0)

或许以不同的方式思考问题会更容易也更合乎逻辑。

而不是将模式与字符串匹配....如何将字符串用作模式并在模式中查找。

例如

string =“猫坐在上面” pattern =“猫坐在垫子上”

string总是模式的一个子集,只是进行正则表达式匹配的情况。

如果这是有道理的; - )