python替换一个字符少的子字符串

时间:2012-12-18 09:23:53

标签: python regex

我需要处理语法类似于markdown http://daringfireball.net/projects/markdown/syntax的行,其中我的情况下的标题行是这样的:

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

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

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

我对python正则表达式的小知识还不足以理解如何替换数字 ' ='与(n-1)' ='标志

5 个答案:

答案 0 :(得分:5)

您可以使用backreferences和两个negative lookarounds来查找两组相应的=个字符。

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 =

答案 1 :(得分: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中,人们有时会在一行的末尾留下空格(也许是开头)。相应调整以满足您的要求。

这是live demo

答案 2 :(得分:0)

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

有没有理由不这样做?

答案 3 :(得分: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('==')]

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

只要每个“行”以“== ....”开头和结尾,并且如果您将这些作为标题使用,那么它将起作用,只要您将新行删除即可。

答案 4 :(得分:0)

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

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

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

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