【问题标题】:Python: regex substitutionPython:正则表达式替换
【发布时间】:2016-05-13 14:11:29
【问题描述】:

好的,我通常不会问这类问题。

使用 re.sub 查找和替换普通字符串很简单,但是替换部分(而不是匹配部分)中的正则表达式如何工作?

特别是提到 Brian Okken's web-page,它声称可以准确解释这一点,提供代码来复制他在 Pearl 中习惯的相同类型的功能,但在 python 中开发时遇到了困难。

import fileinput
import re

for line in fileinput.input():
    line = re.sub(r'\* \[(.*)\]\(#(.*)\)', r'<h2 id="\2">\1</h2>', line.rstrip())
    print(line)

这个子是为了匹配

* [the label](#the_anchor)

替换成

<h2 id="the_anchor">the label</h2>

它有效:但脚本如何准确地知道标签和锚点是什么?大概 \1 和 \2 旨在匹配所需的文本,但脚本如何知道这一点而不认为前导 * 指的是 \1?

【问题讨论】:

  • 因为括号。替换中的\1 指的是匹配正则表达式中第一对括号(即第一个(.*))的任何内容。
  • \1, \2 是要替换的模式中的第一个和第二个匹配组。组是括号中的模式部分。
  • \(GroupReference) 用于引用匹配文本中的组。如果您不知道什么是组,我建议您研究一下。在这种情况下,\1\2 是对第 1 组和第 2 组的引用,换句话说,分别是第一对和第二对 () 括号内的内容。

标签: python regex


【解决方案1】:

替换字符串中的\1\2 指的是第一个和第二个“捕获”。捕获是模式正则表达式的一部分,用括号括起来。

例如,以下是示例正则表达式中的捕获:

r'\* \[(.*)\]\(#(.*)\)'
       ^^^^     ^^^^

所以\1 指的是第一次捕获匹配的内容,\2 指的是第二次捕获匹配的内容。

【讨论】:

  • 为什么我认为正则表达式不会从零开始计数?嘘
  • 实际上,在许多正则表达式实现中,\0 指的是整个匹配的字符串。 Python 正则表达式可能是这样。
  • 在 Python 中,要访问替换中的整个匹配项,需要r'\g&lt;0&gt;'。只需阅读文档。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2012-02-16
相关资源
最近更新 更多