【问题标题】:How do I get a python regular expression to return all text not matching?如何让 python 正则表达式返回所有不匹配的文本?
【发布时间】:2011-05-03 15:59:53
【问题描述】:

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

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 值:Some Value,Var 2 值:837,Var 3 值:更多东西"

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

提前致谢!

【问题讨论】:

  • 编辑您的问题。看到蓝色小标签框正下方的小编辑按钮了吗?

标签: python regex replace


【解决方案1】:

使用替换函数插入任意替换。请参阅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而不是匹配的字符串。

【讨论】:

  • @Andrew:这是一个可以一次性运行的示例。 OP 也可以使用不同的查找方法。
  • 抱歉,我误读了帖子,认为他是在索引而不是值上替换。
  • 我已经更新了答案以包含更好的值来插入(匹配 OP)以及输出的样子。
【解决方案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'']

【讨论】:

  • Martijn 的解决方案可能会奏效,但感谢拆分指针 - 总是很高兴学习新方法。
【解决方案3】:

您不能只 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])

【讨论】:

    【解决方案4】:

    用“p.sub”代替“p.findall”。

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2018-02-18
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多