如何使用Python Regex基于比较将大括号中的文本替换为另一个文本

时间:2014-08-06 14:34:25

标签: python regex

我对正则表达式很陌生。我有一个看起来像这样的字符串:

str = "abc/def/([default], [testing])"

和字典

dict = {'abc/def/[default]' : '2.7', 'abc/def/[testing]' : '2.1'}

并且使用Python RE,在将dict中的每个元素与str进行比较后,我希望以这种形式使用str:

str = "abc/def/(2.7, 2.1)"

如何使用Python RE做任何帮助?

P.S。它不是任何任务的一部分,而是我的工作项目的一部分,我花了很多时间来找出解决方案但是徒劳无功。

3 个答案:

答案 0 :(得分:0)

这里可能不需要正则表达式。希望这有帮助

lhs,rhs = str.split("/(")                                          
rhs1,rhs2 = rhs.strip(")").split(", ")                             
lhs+="/"                                                           
print "{0}({1},{2})".format(lhs,dict[lhs+rhs1],dict[lhs+rhs2])

<强>输出

abc/def/(2.7,2.1)

答案 1 :(得分:0)

import re

st = "abc/def/([default], [testing], [something])"
dic = {'abc/def/[default]' : '2.7',
       'abc/def/[testing]' : '2.1',
       'bcd/xed/[something]' : '3.1'}



prefix_regex = "^[\w*/]*"
tag_regex = "\[\w*\]"

prefix = re.findall(prefix_regex, st)[0]
tags = re.findall(tag_regex, st)

for key in dic:
    key_prefix = re.findall(prefix_regex, key)[0]
    key_tag = re.findall(tag_regex, key)[0]
    if prefix == key_prefix:
        for tag in tags:
            if tag == key_tag:
                st = st.replace(tag, dic[key])

print st

<强>输出:

abc/def/(2.7, 2.1, [something])    

答案 2 :(得分:0)

以下是使用re模块的解决方案。

假设:

  • 有一个字典,其键由前缀和可变部分组成,变量部分用括号括起来([]
  • 值是字符串
  • 中要替换变量部分的字符串
  • 字符串由前缀,(,可变部分列表和)
  • 组成
  • 字符串中的变量部分包含在[]
  • 字符串中的变量部分用逗号分隔,后跟可选空格

Python代码:

import re

class splitter:
    pref = re.compile("[^(]+")
    iden = re.compile("\[[^]]*\]")
    def __init__(self, d):
        self.d = d
    def split(self, s):
        m = self.pref.match(s)
        if m is not None:
            p = m.group(0)
            elts = self.iden.findall(s, m.span()[1])
            return p, elts
        return None
    def convert(self, s):
        p, elts = self.split(s)
        return p + "(" + ", ".join((self.d[p + elt] for elt in elts)) + ")"

用法:

s = "abc/def/([default], [testing])"
d = {'abc/def/[default]' : '2.7', 'abc/def/[testing]' : '2.1'}
sp = splitter(d)
print(sp.convert(s))

输出:

abc/def/(2.7, 2.1)