我希望从文本中删除所有链接,并将它们替换为以“示例://”和“示例_2://”协议开始的替代。所有其他环节应保持不动。
下面的regex将替换所有链接,尽管我限制了链接类型:
(\<a).+?(example|example_two)?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))(.+?)</a>+"是否有人建议将regex按预期的方式工作?
发布于 2022-01-21 18:55:21
根据链接中允许的字符,这应该可以工作:
import re
link1 = r'<a href=example_two://path.com/to/something?and_some_parameters=1234&and_ano%20ther_one=asdf />'
link2 = r'<a> href="example_two://path.com/to/something?and_some_parameters=1234&and_another_one=asdf"</a>'
pattern = re.compile(r"(?P<before>(?:(?P<opening><a>)|<a).*)(?:example|example_two)://[a-zA-Z0-9_/.=%?&$:;#,<>]*(?P<after>.*(?(opening)</a>|/>))")
print(pattern.sub(r"\g<before>https://stackoverflow.com\g<after>", link1))
print(pattern.sub(r"\g<before>https://example.com\g<after>", link2))
# Prints:
# <a href=https://stackoverflow.com/>
# <a> href="https://example.com"</a>这将获取链接之前的任何内容,并将其放入before组中,在after组中的链接之后放置任何内容,然后替换pattern.sub中的完全匹配。替换是before和after组中匹配的连接,替换链接位于中间。
此外,结束标签是以开始标签为条件的。如果开始标记为<a>,则匹配的结束标记为</a>,否则将匹配/>。
https://stackoverflow.com/questions/70804746
复制相似问题