将github风格的降价正则表达式从ruby转换为python

时间:2011-01-28 10:36:20

标签: python ruby regex markdown

我正在尝试在python中使用github风格的markdown实现,没有运气......我没有太多的正则表达式技巧。

以下是来自github的红宝石代码:

# in very clear cases, let newlines become <br /> tags
text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x|
  x.gsub(/^(.+)$/, "\\1  ")
end

到目前为止,这是我在python 2.5中提出的:

def newline_callback(matchobj):
    return re.sub(r'^(.+)$','\1 ',matchobj.group(0))     
text = re.sub(r'(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+', newline_callback, text)

似乎根本没有任何影响: - /

如果有人在python中有github flavored markdown的完全正常实现,除了this one(似乎不适用于换行符),我很乐意听到它。我真的最关心新线。

这些是正则表达式的测试,来自github的ruby代码:

>>> gfm_pre_filter('apple\\npear\\norange\\n\\nruby\\npython\\nerlang')
'apple  \\npear  \\norange\\n\\nruby  \\npython  \\nerlang'
>>> gfm_pre_filter('test \\n\\n\\n something')
'test \\n\\n\\n something'
>>> gfm_pre_filter('# foo\\n# bar')
'# foo\\n# bar'
>>> gfm_pre_filter('* foo\\n* bar')
'* foo\\n* bar'

2 个答案:

答案 0 :(得分:1)

Ruby版本在正则表达式中有多行修饰符,所以你需要在python中做同样的事情:

def newline_callback(matchobj):
    return re.sub(re.compile(r'^(.+)$', re.M),r'\1  ',matchobj.group(0))     

text = re.sub(re.compile(r'(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+', re.M), newline_callback, text)

所以代码将(比如Ruby版本)在换行之前添加两个空格,除非我们有两个换行符(段落)。

您提供的测试字符串是否正确?您链接的文件具有此功能,并且可以使用该固定代码:

"apple\npear\norange\n\nruby\npython\nerlang"
->
"apple  \npear  \norange\n\nruby  \npython  \nerlang"

答案 1 :(得分:0)

return re.sub(r'^(.+)$',r'\1 ',matchobj.group(0))
                       ^^^--------------------------- you forgot this.