gpt4 book ai didi

javascript - 我可以使用正则表达式替换字符串中的所有关键字吗? (Python)

转载 作者:行者123 更新时间:2023-12-02 21:25:13 27 4
gpt4 key购买 nike

这是我的代码:


# case 1
content = "staging_datastorage"
query_term = "st ta ag"

# case 2
# content = "game_event"
# query_term = "gam ame"

terms = re.findall('[a-z0-9]+', query_term, re.I)
terms.sort(key=len, reverse=True)
term_regex = "|".join(terms)
replace_content = re.sub(rf"({term_regex})", r'<em>\1</em>', content, flags = re.I)
print(replace_content)

我想做的是使用 <em> HTML 标记用于使用我的输入字符串 ( content ) 突出显示表中的某些关键字 (称为 query_term )。输入字符串包含我想要突出显示的关键字并除以空格

对于这两种情况,我想要的结果是:

case 1:
this is better
<em>stag</em>ing_da<em>tast</em>or<em>ag</em>e
this is also fine(nesting highlight tag):
<em>s<em>t<em></em>a</em>g</em>ing_da<em>ta<em></em>st</em>or<em>ag</em>e

case 2:
perfect result:
<em>game</em>_event
fine result:
<em>g<em>am</em>e</em>_event

我的代码有一个错误:对于情况 2,它只突出显示 gam而不是nam ,这个结果是不对的: <em>gam</em>e_event

我认为这种情况有点复杂,一个关键字嵌套在另一个关键字中,或者一个关键字是另一个关键字的开始(或结束)部分。

我可以使用正则表达式来解决这个问题吗?

最佳答案

正如我在评论中所说,搜索是不重叠的,下一个找到的是剩余部分。

你可以做什么想法#1:

re.sub每个关键字单独循环。

当然,如果搜索重叠,您可以有一些 <em></em>已经挡住了 - 就像这里,ame不匹配am</em>e - 所以你需要修改单关键字正则表达式。包括(?:</?em>)?字母之间。

terms = re.findall('[a-z0-9]+', query_term, re.I)
terms.sort(key=len, reverse=True)
replace_content = content
for term in terms:
term_regex = "(?:</?em>)?".join(term)
replace_content = re.sub(rf"({term_regex})", r'<em>\1</em>', replace_content, flags = re.I)

print(replace_content)

两种情况的结果:

<em>s<em>t</em><em>a</em>g</em>ing_da<em>ta</em><em>st</em>or<em>ag</em>e
<em>g<em>am</em>e</em>_event
<小时/>

想法#2

您可以预处理关键字本身,查找哪些前缀与后缀匹配,然后将它们合并到其他关键字中。

这里:gam有后缀am , ame有前缀 am -> 你添加game按照您的条件。

这个想法将给出“完美的结果”

<小时/>

想法#3*

执行想法#1,删除嵌套的突出显示并将彼此相邻的突出显示合并(即删除 </em><em> )。

这个想法也会带来“完美的结果”。

要删除一层嵌套,请执行以下操作:

re.sub(r"<em>([^/]*)<em>([^/]*)</em>([^/]*)</em>", r"<em>\1\2\3</em>", replace_content, flags = re.I)

正则表达式的工作原理是按 <em> 的顺序查找标签。 <em> </em> </em> (如此嵌套)与任何没有 / 的字符组它们之间(一种确保我们只采用最近的结束标记的快速方法)。

显然,只删除了一层嵌套,我们还需要在循环中使用它 - 这将是 while循环:当替换与上次不同时,再次替换 = 当替换不再进行更改时停止。

final_result = ""
while final_result != replace_content:
final_result = replace_content
replace_content = re.sub(r"<em>([^/]*)<em>([^/]*)</em>([^/]*)</em>", r"<em>\1\2\3</em>", final_result, flags = re.I)

print(final_result)

案例 2 只需要一个替换,所以让我们看看它在案例 1 上如何工作:

<em>stag</em>ing_da<em>ta</em><em>st</em>or<em>ag</em>e

现在只需要 </em><em>正如我提到的,删除!

在想法 #1 代码之后放置的最后一段代码:

final_result = ""
while final_result != replace_content:
final_result = replace_content
replace_content = re.sub(r"<em>([^/]*)<em>([^/]*)</em>([^/]*)</em>", r"<em>\1\2\3</em>", final_result, flags = re.I)

final_result = final_result.replace("</em><em>", "")
print(final_result)

给予:

<em>stag</em>ing_da<em>tast</em>or<em>ag</em>e

关于javascript - 我可以使用正则表达式替换字符串中的所有关键字吗? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60756652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com