【问题标题】:How to check if re.sub() has successfully replaced in python? [duplicate]如何检查 re.sub() 是否已在 python 中成功替换? [复制]
【发布时间】:2015-12-13 17:50:55
【问题描述】:

既然re.sub()返回整个修改/未修改的字符串,有没有什么方法可以检查re.sub()是否已经成功修改了文本,而不搜索re.sub()的输出?

【问题讨论】:

  • 为什么不能正确替换。如果您想知道里面是否有任何匹配项,可以使用re.match()before 检查正则表达式的字符串。
  • 我认为这个问题的意思是:“你怎么知道 re.sub() 是否进行替换”
  • 你到底想做什么?
  • @Padraic :考虑在“if”条件下验证 re.sub() 后打印“替换成功”等消息。

标签: python regex


【解决方案1】:

您可以使用re.subn,它执行与 sub() 相同的操作,但返回一个元组 (new_string, number_of_subs_made)

如果修改次数是0,即字符串没有被修改。

>>> re.subn('(xx)+', '', 'abcdab')
('abcdab', 0)
>>> re.subn('(ab)+', '', 'abcdab')
('cd', 2)
>>> 

【讨论】:

  • 感谢 Praveen,这提供了有关修改的信息。
【解决方案2】:

如果你有以下代码:

import re
s1 = "aaa"
result = re.sub("a", "b", s1)

您可以通过将 result 的 id 与 s1 进行比较来检查对 sub 的调用是否进行了替换,如下所示:

id(s1) == id(result)

或者,也一样:

s1 is result

这是因为python中的字符串是不可变的,所以如果进行任何替换,结果将是与原始字符串不同的字符串(即:原始字符串未更改)。使用 id 而不是字符串的内容进行比较的优点是比较是常数时间而不是线性的。

【讨论】:

  • 无法理解反对票。我确认这有效。这甚至被记录在案:“如果找不到模式,则字符串原封不动地返回”。好吧,它没有明确地说“同一个对象”,所以它可能有时会中断,但如果 OP 坚决避免比较,这是我们能提供的最好的。
  • re.sub(s1, "a", "b") 在您的回答中毫无意义
  • 帕德里克,谢谢我已经更改了答案以反映这一点
  • 好吧,在另一个答案中不知道subn(因为我从来不需要它),那绝对是“一种明显的方式”。这个还是不愧是“二等奖”。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 2021-12-08
  • 2023-04-05
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多