我需要处理语法类似于markdown http://daringfireball.net/projects/markdown/syntax的行,其中我的情况下的标题行是这样的:
=== a sample header ===
===== a deeper header =====
我需要改变它们的深度,即减少它(或增加它),所以:
== a sample header ==
==== a deeper header ====
我对python正则表达式的小知识还不足以理解如何替换数字 ' ='与(n-1)' ='标志
答案 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模块的子功能,但这不是必需的