regex 使用Python将相似的单词替换为不同的单词

xxhby3vn  于 2023-01-06  发布在  Python
关注(0)|答案(1)|浏览(145)

我尝试用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逐个替换子字符串。

xzv2uavs

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

相关问题