簡體   English   中英

查找所有出現的正則表達式模式並替換為eval輸出

[英]Find all occurrences of a regex pattern and replace with eval output

我有一個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())行, eval(c.lower())預期輸出。 但是, re.sub行失敗並出現以下錯誤:

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

不知道我在哪里錯了。

您不必使用不同的搜索和替換功能。 您可以使用re.sub的函數形式調用eval

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

您想要轉義搜索模式, 因為括號是正則表達式中的特殊字符 您可以使用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())

同樣的事情,但沒有eval()或導入:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM