【问题标题】:Python: sub pattern doesn't replace all patterns foundPython:子模式不会替换找到的所有模式
【发布时间】:2013-05-29 00:46:08
【问题描述】:

我正在尝试获取以下代码:

pattern = r"#(.*?)#"
pattern_obj = re.compile(pattern, re.MULTILINE)
translation = pattern_obj.sub("<li>\\1</li>", translation)

查找任何被# 包围的文本。它取代了第一个实例

>>><li> TEXT </li>

# More TEXT #

# Even more TEXT #

有人可以帮帮我吗?

提前感谢您!

编辑: 我只是这样解决了这个问题。

pattern = r"#([^#]*)#"
pattern_obj = re.compile(pattern, re.MULTILINE)
translation = pattern_obj.sub("<li>\\1</li>", translation)

【问题讨论】:

  • 它对我有用,即使没有“re.MULTLINE”
  • 很奇怪手动排除# 解决了这个问题。我会认为非贪婪的*? 会阻止这成为一个问题。也许括号搞砸了*?的范围?

标签: python regex replace


【解决方案1】:

来自docs

(点)在默认模式下,它匹配除 a 之外的任何字符 新队。如果指定了 DOTALL 标志,则匹配任何 包括换行符的字符。

由于. 不匹配新行,因此表达式仅查找第一行作为匹配项。

但是,设置 DOTALL 标志也无济于事。由于正则表达式特殊字符通常是贪婪的,因此您最终会匹配第一个 # 和最后一个 # 之间的所有文本。

我可能弄错了,但我相信您需要逐行执行此操作。

【讨论】:

  • * 之后的 ? 使其不贪婪。
  • 即使* 是贪婪的,一旦. 未能匹配新行,它就会开始退出匹配,直到它可以匹配#。因此,这根本不应该影响执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2020-12-10
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多