我有一个字符串,我希望在不使用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.
对于每个值,我都有一个正则表达式模式字典:
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?,但没有成功
我当前的解决方案使用
for k,v in dct.items():
text = re.sub(k,v,text)
我需要一些更具伸缩性的东西。
发布于 2020-12-20 18:56:28
最适合您需要的方法是使用有限状态传感器。re.sub
就像是FST的一个构建块,你最好同时高效地使用它们。
有一个pynini
Python库,它是OpenFST中著名的C++实现的interface。它是quite difficult to use,需要经过一些培训才能理解基本概念。一个相对较好的介绍是this one。
这种方法大致类似于:
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()
https://stackoverflow.com/questions/65378438
复制相似问题