繁体   English   中英

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

[英]Python Multiple regex Patterns string reassignment using re.sub

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

字符串示例 =

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.

我有每个值的正则表达式模式字典:

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

尝试了如何在 python 中使用正则表达式进行多次替换? 但没有成功

我目前的解决方案使用

for k,v in dct.items():
    text = re.sub(k,v,text)

我需要一些更具可扩展性的东西。

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

有一个pynini Python 库,它是OpenFST著名的 C++ 实现的接口 很难使用,需要一些培训才能理解基本概念。 比较好的介绍就是这个

该方法大致类似于:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM