如何让Python正则表达式返回所有不匹配的文本?

2 投票
4 回答
1336 浏览
提问于 2025-04-16 16:54

我用下面这个正则表达式成功地匹配并提取了一些特殊标记的文本:

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

你难道不能直接用 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])
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的回答 来进行替换。至于如何返回所有不匹配的文本,你可以在你的正则表达式中去掉分组,然后使用 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'']
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函数会在每次找到匹配时被调用,并且会接收到一个匹配对象。我们会用找到的值(比如'123453'等)去查找替换的值,然后把这个替换的值放进newString中,替代掉原来的匹配字符串。

撰写回答