首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex重新命名并删除字符串中的冗余项

使用regex重新命名并删除字符串中的冗余项
EN

Stack Overflow用户
提问于 2015-10-15 15:33:05
回答 1查看 35关注 0票数 1

我正在尝试使用pythons特性在一些文本中重新命名一些标识符。

这是一个文本的例子。我基本上是想把所有的v都按数字顺序编号。

代码语言:javascript
复制
@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

所以想要的输出是

代码语言:javascript
复制
@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”元素是相同的。因此,对于我来说,这是多余的信息,需要删除。

我的守则:

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-15 16:02:09

可能的解决办法:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
@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

您可以轻松地连接所有字符串并获得带有重新标记标识符的文本。如下所示:

代码语言:javascript
复制
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'

对于一些更困难的案例:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33152667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档