因此,我使用以下正则表达式成功匹配并提取了一些特殊标记文本:
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”
或者,如果有更好的替代方法,我会全力以赴。
提前致谢!
答案 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”。