查找所有出现的正则表达式模式并替换为eval输出

时间:2016-03-25 14:48:02

标签: python regex

我有一个包含很多字符串的txt文件,例如

Chr(101)
Chr(97)
Chr(104)
...

我使用以下代码使用正则表达式查找所有出现的此类字符串。我想做的是用它的评估输出替换每个事件。所以在这种情况下我会用以下内容替换上面的内容:

e
a
h

我的代码如下:

with open(oFile, "r") as f:
    for line in f:
      # find all occurrences of Chr(\d+\) and put in a list
      chrList = [str(s) for s in re.findall(r'Chr\(\d+\)', line)]
      # print chrList 
      for c in chrList:
        # print eval(c.lower())
        out = re.sub(c, eval(c.lower()), line)

如果我打印eval(c.lower())行,则按预期输出。但是re.sub行失败并出现以下错误:

raise error, v # invalid expression sre_constants.error: bogus escape (end of line)

不确定我在哪里出错。

3 个答案:

答案 0 :(得分:2)

您不必使用不同的搜索和替换功能。您可以使用eval的函数形式调用re.sub

for line in f:
  out = re.sub(r'Chr\(\d+\)', lambda c: eval(c.group(0).lower()), line)
  print out

答案 1 :(得分:1)

您想要逃避搜索模式because parenthesis are special characters in regular expressions。您可以使用re.escape轻松完成此操作。

out = re.sub(re.escape(c), eval(c.lower()), line)

作为一个例子:

strings = ['Chr(100)', 'Chr(101)', 'Chr(102)']
values = [re.sub(re.escape(c), eval(c.lower()), c) for c in strings]

# ['d', 'e', 'f']

话虽如此,为什么不使用replace()

out = line.replace(c, eval(c.lower())

答案 2 :(得分:0)

同样但没有eval()或导入:

strings = ['Chr(100)', 'Chr(101)', 'Chr(102)']
values = [chr(x) for x in (int(c.replace("Chr(", "").replace(")","")) for c in strings)]