【发布时间】:2016-08-06 06:05:09
【问题描述】:
我正在构建一个将*asterisks* 转换为<b>bold tags</b> 的正则表达式,作为Markdown 的更简单版本。正则表达式如下所示:
markdown = '\*(?P<name>.+)\*'
bold = '<b>\g<name></b>'
text = 'abcdef *bold* ghijkl'
print(re.sub(markdown, bold, text))
>>> abcdef <b>bold</b> ghijkl
现在我需要忽略转义的星号\*,在这里我遇到了两个问题:
问题 1
当我尝试将转义符号指定为 \\
markdown = '[^\\]\*(?P<name>.+)[^\\]\*'
我收到一个 Python 错误:
sre_constants.error: unexpected end of regular expression
所以某处存在语法错误,似乎无法修复。
问题 2
假设我想忽略前置符号 A(不是反斜杠)。我的正则表达式在这里起作用:
markdown = '[^A]\*(?P<name>.+)[^A]\*'
bold = '<b>\g<name></b>'
text = 'abcdef A*bold* ghijkl'
print(re.sub(markdown, bold, text))
>>> abcdef A*bold* ghijkl
但如果我的行中没有前置A,则文本中的一些有价值的符号会被正则表达式消耗:
text = 'abcdef *bold* ghijkl'
print(re.sub(markdown, bold, text))
>>> abcdef<b>bol</b> ghijkl
注意第一个空格 和字母d 已经消失了。
我该如何处理这两个问题?
【问题讨论】:
-
正则表达式并非在所有情况下都有效,请编写一个简单的解析器。