如何获取python正则表达式以返回所有不匹配的文本?

时间:2011-05-03 15:59:54

标签: python regex replace

因此,我使用以下正则表达式成功匹配并提取了一些特殊标记文本:

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
theIds = p.findall(theString)

返回

[u'123453', u'984561', u'123456']

这正是我需要的。接下来,我需要替换那些具有一些抬头价值的东西,所以我接下来想要的是:

[u'Var 1 value: ', u', Var 2 value: ', u', Var 3 value: ']

这样我就可以将这些字符串与第一个列表中的查找值粘合在一起,从而得到一个如下所示的字符串:

u“Var 1 value:Some Value,Var 2 value:837,Var 3 value:more stuff”

或者,如果有更好的替代方法,我会全力以赴。

提前致谢!

4 个答案:

答案 0 :(得分:2)

以下情况如何?

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
replacements = ["Some Value", "837", "more stuff"]
newString = p.sub(lambda m: replacements.pop(0), theString)

您可以为re.sub()提供一个功能,在这种情况下,该功能会从replacements列表中获取第一项,并将其替换为匹配项。

编辑:我误解了这个问题而错过了您想要根据初始值查找替换值,您可能需要Martijn's answer之类的替代值。至于返回所有不匹配的文字,您可以删除正则表达式中的组,然后使用re.split()

>>> theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
>>> p = re.compile("%%v:[0-9]*%%")
>>> p.split(theString)
[u'Var 1 value: ', u', Var 2 value: ', u', Var 3 value: ', u'']

答案 1 :(得分:2)

使用替换函数插入任意替换。有关该功能的工作原理,请参阅re.sub文档。这是一个例子:

values = {
    u'123453': u'Some Value',
    u'984561': u'837',
    u'123456': u'more stuff',
}

def insertLookup(matchobj):
    return values[matchobj.group(1)]

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
newString = p.sub(insertLookup, theString)

print newString
u"Var 1 value: Some Value, Var 2 value: 837, Var 3 value: more stuff"

每个匹配都会调用insertLookup函数,并传递MatchObject。然后,我们使用匹配的值(u'123453'等)来查找替换值,然后将其插入newString而不是匹配的字符串。

答案 2 :(得分:0)

你不能只是split(', ')字符串并使用各个部分吗?

我的一个天真的解决方案是这样的:

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"

for chunk in theString.split(', '):
  temp = str(chunk)

  p = re.compile("\%%v:([0-9]*)%%")
  theIds = p.findall(theString)

  theOpposite = temp.replace(theIds[0])

答案 3 :(得分:0)

而不是“p.findall”使用“p.sub”。