首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python多正则表达式模式使用re.sub重新分配字符串

Python多正则表达式模式使用re.sub重新分配字符串
EN

Stack Overflow用户
提问于 2020-12-20 17:16:46
回答 1查看 90关注 0票数 0

我有一个字符串,我希望在不使用For循环的情况下识别10多个可能的模式并替换它们

字符串示例=

text = congrats! first recharge of USD 661 is successful & your service is valid till 2019-10-19. dial 0123456789 or click bit.ly/vf_asdqweerw in 46 hours to avail your reward.

预期结果=

congrats! first recharge of USD <Amount> is successful & your service is valid till <Date>. dial <PhoneNumber> or click <Link> in 46 hours to avail your reward.

对于每个值,我都有一个正则表达式模式字典:

代码语言:javascript
运行
复制
dct = {
      r"((http(s?)://)|(bit\\.l)|(www.)).+?(?=[, ]|$)": <Link>,
      r"(\d{2}[-/.])(\w{1,3}|\d{2})[-/.](\d{2,4})\b"  : <Date>,
      .....
}

尝试了How can I do multiple substitutions using regex in python?,但没有成功

我当前的解决方案使用

代码语言:javascript
运行
复制
for k,v in dct.items():
    text = re.sub(k,v,text)

我需要一些更具伸缩性的东西。

EN

回答 1

Stack Overflow用户

发布于 2020-12-20 18:56:28

最适合您需要的方法是使用有限状态传感器。re.sub就像是FST的一个构建块,你最好同时高效地使用它们。

有一个pynini Python库,它是OpenFST中著名的C++实现的interface。它是quite difficult to use,需要经过一些培训才能理解基本概念。一个相对较好的介绍是this one

这种方法大致类似于:

代码语言:javascript
运行
复制
import pynini
mappings = [pynini.transducer(k, v) for k, v in dct.items()]
kvmap = pynini.union(*mappings)

def multi_substitute(in_str):
    return pynini.shortestpath(pynini.compose(in_str, kvmap)).stringify()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65378438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档