gpt4 book ai didi

python - 如何使用正则表达式将 asterix * 替换为 html 标签

转载 作者:行者123 更新时间:2023-12-04 01:01:15 26 4
gpt4 key购买 nike

我正在尝试使用正则表达式将字符串中的 * 替换为 <em></em>标签。

例如: My *name* is John输出 My <em>name</em> is John

但是,如果有**彼此相邻,我不想用 <em> 替换它们.

我有以下代码。问题是当我运行它时,它替换了 **<em></em> .我要

Hello *there* are two aster**es next to each other

输出

Hello <em>there</em> are two aster**es next to each other

相反我得到

Hello <em>there</em> are two aster<em></em>es next to each other

我的代码:

def emphasis(string):

regex = re.compile('(\s?)\*(.*?)\*(\s?)')
return re.sub(regex, replace_function, string)


def replace_function(input):
match = input.group()
if match:
return re.sub('(\s?)\*(.*?)\*(\s?)', '\\1<em>\\2</em>\\3', match)

我的测试:

def test_if_two_asterix_are_next_to_each_other(self):
title = "Hello *there* are two aster**es next to each other"
expected = "Hello <em>there</em> are two aster**es next to each other"
actual = _emphasis(title)
self.assertEqual(actual,expected)

测试失败,我得到:

Hello <em>there</em> are two aster<em></em>es es next to each other

最佳答案

markdown图书馆也许是这里最合适的解决方案。

但是,就正则表达式而言,问题在于起始分隔符和尾随分隔符是同一个字符。当您尝试匹配该字符以外的一个或多个字符时,您可能会捕获前一个不成功匹配的尾随 * 并匹配到下一个匹配的前导 * .

因此,最简单的正则表达式解决方案是匹配两个连续的 * 字符并匹配 *,除 * 之外的任何零个或多个字符,然后a * 在其他情况下。捕获两个星号之间的内容,并用您想要的标签将其包装在用作替换参数的可调用文件中:

import re
pattern = r"\*{2,}|\*([^*]*)\*"
text = "Hello *there* are two aster**es next to each other"
print( re.sub(pattern, lambda x: f'<em>{x.group(1)}</em>' if x.group(1) else x.group(), text) )
## => Hello <em>there</em> are two aster**es next to each other

参见 Python demo .

关于python - 如何使用正则表达式将 asterix * 替换为 html <em> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68120641/

26 4 0