Caterpillar通过将BPMN生成为solidity代码后, 我需要对solidity代码做二次处理,即在其中的特定函数中插入event类型,以便去做事件监听.
最终生成的不仅包括solidity的事件部分,还包括了web3js的事件监听模块.

第一个问题是在solidity程序中,找到特定的某一行,然后在该行后再插入一行,如何办到?
这里用一个solidity程序做例子.

pragma solidity ^0.4.0;

contract SimpleStorage {
      uint storedData; // 声明一个类型为 uint (256位无符号整数)的状态变量,叫做 storedData

      function set(uint x) public {
            storedData = x; // 状态变量可以直接访问,不需要使用 this. 或者 self. 这样的前缀
      }

      function get() public view returns (uint) {
            return storedData;
      }
}

在执行get()函数所在行的下一行插入一条语句,如何办到?

思路:

1.用r+方式打开文本文件,
2. for line in f # 遍历每一行
3. if "xxx" in line  #如果包含get()的字符串在该行中,则符合判断条件
4. 在该行后加入一行所需字符串, 使用字符串拼接。比如 line = line + " \n xxxxx",便可插入一行。

第二个问题:
如果给你的sol代码全部被写成了一行,且换行符全部用\n字符串表示,要如何进行插入呢?
确实,Caterpillar生成的solidity代码原始格式就是一个字符串并且包含了\n字符串. 因此首先要将\n字符串替换为转义字符串
然后再使用上面的插入指令的方法. 最后再将格式重新变为包含\n子串的字符串.

一些基础知识

r+方法是可读可写,
a方法是追加, 一般生成新的文件,用a模式(add)。
还有哪些常用模式?

python3打开文件

python2中用unicode方式格式字符串的方式是unicode("sss","utf-8"),
但是在python3中已经弃用,
NameError: name 'unicode' is not defined # python3中unicode()已经弃用而只使用str()了。

参考资料

python做编译器

python替换所有符合要求的字符串

第一种方法是python的字符串替换函数replace.

a = "i love love love you"
newstr = a.replace("love", "hate")

替换之后,所有的love都会变为hate,因此这是全部替换。
replace函数并不总是成功。 replace第三个参数是次数,如果是缺省,则是替换所有。

第二种方法是正则表达式,python正则表达式标准库re.
用法:

import re
a = 'i love love love you'
regex = re.compile('love') # 写入正则表达式
newstr = regex.sub('hate', a) #sub是正则替换方法,通过正则表达式匹配到字符串进行替换,第二个参数是原字符串
假设有字符串 r"aasdfasef\nsfewf\n",现在要将字符串\n处理为转义字符\n,并且在处理完成后在某一行插入一行命令。
使用solidity代码处理。 将所有的\\n替换为\n,然后再将solidity的事件桩插入,之后再将\\n变回\n.
使用正则表示式的方法,用\n替换\\n的方法行不通。原因是没有正确识别正则表示式里面的'\'。最后发现是没有在 '\\n'前面加r,即 r'\\n'


其实还可以通过用python字符串切分的方式,先将该字符串按照\\n切分.然后再逐行输出。但是效率太低下了。

python字符串前加r的含义:
将\变为普通字符而不是转义符号。在python3中,字符串即使是\\n也仍然无法解析,而最好在字符串之前加上r,表明\不是转义字符。
r的作用就是去除转义字符,将转义字符变为普通字符.