如何正则匹配并替换_i_,__b__,___ib___的混合文本?

RT
我想实现一个用正则将MD替换成Discuz论坛码的功能,但是粗体斜体这里抓瞎了……
比如有这样一句话:

_斜体1_
*斜体2*

**粗体1**
__粗体2__

这也是__粗体2__的

如果遇到__粗体__、_斜体_还有___粗斜体___在同一行该怎么办?

我本来是想先匹配斜体,我这么写的:

if __name__ == '__main__':
    content = readfile("readme.md") #readfile这里直接理解成有个函数处理打开文件并返回所有内容
    
    for line in content:
        result = re.search(r'_[^_].*[^_]_',line)
        if result:
            print("Find!",result.group())

匹配的结果是:

Find! _斜体1_
Find! _粗体2_
Find! _粗体2_
Find! _粗体__、_斜体_还有___粗斜体_

这和事先说好了的不一样啊……
请问遇到这种混合的文本我该怎么找到目标?

另外,我用sub替换的时候发现内容也被替换走了……

res = re.sub(r'_[^_].*[^_]_','<i>.*</i>',line)
print(res)

结果是:

Find! _斜体1_ RE_MOD=> <i>.*</i>

Find! _粗体2_ RE_MOD=> _<i>.*</i>_

Find! _粗体2_ RE_MOD=> 这也是_<i>.*</i>_的

Find! _粗体__、_斜体_还有___粗斜体_ RE_MOD=> 如果遇到_<i>.*</i>__在同一行该怎么办?

请问怎么保留不想替换的正文内容?

阅读 2.4k
2 个回答

方法有挺多的呀, 如果你嫌麻烦, 就直接将_全部替换成*, 但这难免会有替换错的地方, 或许可以考虑下面的方法:

# coding: utf8
import re

a = '''
_斜体1_
*斜体2*

**粗体1**
__粗体2__

这也是__粗体2__的

如果遇到__粗体__、_斜体_还有___粗斜体___在同一行该怎么办?'''



bold_italic = re.sub('___([^_]+)___', r'***\1***', a)  # 替换粗斜体
bold = re.sub('__([^_]+)__', r'**\1**', bold_italic)   # 替换粗体
result = re.sub('_([^_]+)_', r'*\1*', bold)            # 替换斜体
print result

考虑使用markdown解析类库完成。这种需求用正则匹配的话太容易出BUG了。
比如又斜杠转义问题,反引号引用问题,再比如说markdown允许嵌入html代码。这些问题你用正则根本不好处理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题