使用正则表达式重新标记和删除字符串中的冗余项



我正在尝试使用python的regex功能在某些文本中重新标记一些标识符。

这是文本的一个例子。我实际上是在按数字顺序给所有的v编号。

@r=v4 "v4"
 A -> C : B
 Cell * kcat * B * A / (km + A) 
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C
@r=v4 "v4"
 C -> : D 
 Cell * kcat2 * D * C / (km2 + C)
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C

所以期望的输出是

@r=v1 "v1"
 A -> C : B
 Cell * kcat * B * A / (km + A) 
@r=v2 "v2"
 C -> C+D
 Cell * v2_k * C
@r=v3 "v3"
 C -> : D 
 Cell * kcat2 * D * C / (km2 + C)
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C

然而,也有一个并发症。如果你仔细观察,你会发现'v2'和'v4'元素是相同的。因此,这对我来说是多余的信息,需要我删除。

My Code:

string='''
@r=v4 "v4"
 A -> C : B
 Cell * kcat * B * A / (km + A) 
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C
@r=v4 "v4"
 C -> : D 
 Cell * kcat2 * D * C / (km2 + C)
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C
'''
pattern=re.compile('@r=(.*)')
    for i in range(len(re.findall(pattern,string))):
        print re.sub(pattern,'@r=v{} "v{}"'.format(str(i+1),str(i+1)),string)

然而,这并没有给我想要的输出。有人知道怎么做我想要的吗?由于

可能解:

string='''@r=v4 "v4"
 A -> C : B
 Cell * kcat * B * A / (km + A) 
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C
@r=v4 "v4"
 C -> : D 
 Cell * kcat2 * D * C / (km2 + C)
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C'''
i = 0
for strg in string.splitlines():
    if strg == '@r=v4 "v4"':
        i += 1
        print '@r=v{} "v{}"'.format(i,i)
    else:
        print strg
输出:

@r=v1 "v1"
 A -> C : B
 Cell * kcat * B * A / (km + A) 
@r=v2 "v2"
 C -> C+D
 Cell * v2_k * C
@r=v3 "v3"
 C -> : D 
 Cell * kcat2 * D * C / (km2 + C)
@r=v4 "v4"
 C -> C+D
 Cell * v2_k * C

您可以轻松地连接所有字符串并获得具有重新标记标识符的文本。这样的:

new_text = ""
for strg in string.splitlines():
    if strg == '@r=v4 "v4"':
        i += 1
        new_text += '@r=v{} "v{}"n'.format(i,i)
    else:
        new_text += strg + 'n'

对于稍微复杂一点的情况:

for strg in string.splitlines():
if strg in ['@r=v4 "v4"','@r=v2 "v2"','@r=v3 "v3"'] : # any string if there aren't huge amount of cases
    i += 1
    print '@r=v{} "v{}"'.format(i,i)
else:
    print strg

最新更新