0

我需要处理语法类似于 markdown http://daringfireball.net/projects/markdown/syntax的行,在我的例子中,标题行类似于:

=== a sample header ===
===== a deeper header =====

我需要改变它们的深度,即减少(或增加)它:

== a sample header ==
==== a deeper header ====

我对 python 正则表达式的了解不足以理解如何用 (n-1) '=' 符号替换 n 个 '='

4

5 回答 5

5

您可以使用反向引用和两个否定环顾来查找两组对应的=字符。

output = re.sub(r'(?<!=)=(=+)(.*?)=\1(?!=)', r'\1\2\1', input)

如果您有一个包含多个标题的较长字符串(并将更改所有标题),这也将起作用。

正则表达式有什么作用?

(?<!=)  # make sure there is no preceding =
=       # match a literal =
(       # start capturing group 1
  =+    # match one or more =
)       # end capturing group 1
(       # start capturing group 2
  .*?   # match zero or more characters, but as few as possible (due to ?)
)       # end capturing group 2
=       # match a =
\1      # match exactly what was matched with group 1 (i.e. the same amount of =)
(?!=)   # make sure there is no trailing =
于 2012-12-18T09:30:44.753 回答
0

不需要正则表达式。我会非常简单直接:

import sys

for line in sys.stdin:
    trimmed = line.strip()
    if len(trimmed) >= 2 and trimmed[0] == '=' and trimmed[-1] == '=':
        print(trimmed[1:-1])
    else:
        print line.rstrip()

首字母strip很有用,因为在 Markdown 中人们有时会在行尾(也可能是开头)留下空格。相应地调整以满足您的要求。

这是一个现场演示

于 2012-12-18T09:36:56.220 回答
0

我认为它可以像替换一样'=(=+)'简单\1

有什么理由不这样做吗?

于 2012-12-18T09:38:36.060 回答
0

一个简单的解决方案怎么样?

lines = ['=== a sample header ===', '===== a deeper header =====']
new_lines = []
for line in lines:
    if line.startswith('==') and line.endswith('=='):
        new_lines.append(line[1:-1])

结果:

['== a sample header ==', '==== a deeper header ====']

或在一行中:

new_lines = [line[1:-1] for line in lines if line.startswith('==') and line.endswith('==')]

这里的逻辑是,如果它以 '==' 开头和结尾,那么它必须至少有那么多,所以当我们删除/修剪每一边时,每边至少留下 '='。

只要每条“行”都以其“==....”开头和结尾,这将起作用,并且如果您将它们用作标题,那么只要您去掉换行符,它们就会起作用。

于 2012-12-18T09:39:56.853 回答
0

第一个标题或第二个标题,您可以像这样使用字符串替换

s = "=== a sample header ==="
s.replace("= "," ")
s.replace(" ="," ")

你也可以像这样处理第二个标题

btw:你也可以使用re模块的子功能,但不是必须的

于 2012-12-18T09:41:53.300 回答