我尝试用HTML标记语法替换markdown语法的文本。
转换文本的规则如下:(无法显示HTML标记)
- 符号之间的文本将为粗体。
- ~符号之间的文本为 * 斜体 *。
- {color:red}示例文本{color}将变为红色的"示例文本"。
我的代码如下:
import re
pattern = r"\*(*)\*"
target = "<b>$1</b>"
data = "*~{color:#FF0000}FAIL{color}~**~{color:green}PASS{color}~**~{color:yellow}WARNING{color}~*"
data = re.sub(pattern, target, data)
但它会返回如下错误:
File "regex.py", line 8, in <module>
data = re.sub(pattern, target, data)
...
re.error: nothing to repeat at position 3
我认为案文应改为:
<br><i><font color:#FF0000>FAIL</font></i></br><br><i><font color:green>PASS</font></i></br><br><i><font color:yellow>WARNING</font></i></br>
我不确定如何使用regex逐个替换子字符串。
1条答案
按热度按时间xzv2uavs1#
虽然我想使用一些解析器会更容易,但也可以使用正则表达式来完成,但我只能想到分三步来完成。
为此,我们将使用recursive regex,这意味着匹配“平衡边界内的文本”,因此括号等。
第一步:
图案:
\*((?:[^*]|(?R))*)\*
替换为
<b>$1</b>
后它输出
<b>~{color:#FF0000}stackoverflow{color}~</b>
First step demo
第二步:
图案
\~((?:[^\~]|(?R))*)\~
替代
<i>$1</i>
输出
<b><i>{color:#FF0000}stackoverflow{color}</i></b>
Second step demo
第三步:
图案
\{color:([^}]+)\}((?:(?!\{color\}).*?|(?R))*)\{color\}
替代
<p style="background-color:$1;">$2</p>
输出
<b><i><p style="background-color:#FF0000;">stackoverflow</p></i></b>
Third step demo