在正则表达式输出上执行简单的数学(蟒蛇)

时间:2013-01-05 23:31:59

标签: python regex

是否可以对Python正则表达式的输出执行简单的数学运算?

我有一个大文件,我需要将")"之后的数字除以100.例如,我会转换包含)75)2的以下行:

((words:0.23)75:0.55(morewords:0.1)2:0.55);

)0.75)0.02

((words:0.23)0.75:0.55(morewords:0.1)0.02:0.55);

我的第一个想法是使用re.sub使用搜索表达式"\)\d+",但我不知道如何将括号后的整数除以100,或者如果甚至可以使用{{ 1}}。

有关如何解决此问题的任何想法?谢谢你的帮助!

2 个答案:

答案 0 :(得分:13)

您可以通过提供替代功能来实现:

s = "((words:0.23)75:0.55(morewords:0.1)2:0.55);"

s = re.sub("\)(\d+)", lambda m: ")" + str(float(m.groups()[0]) / 100), s)

print s
# ((words:0.23)0.75:0.55(morewords:0.1)0.02:0.55);

顺便说一句,如果您想使用BioPython's Newick tree parser代替它,它将如下所示:

from Bio import Phylo
# assuming you want to read from a string rather than a file
from StringIO import StringIO

tree = Phylo.read(StringIO(s), "newick")

for c in tree.get_nonterminals():
    if c.confidence != None:
        c.confidence = c.confidence / 100

print tree.format("newick")

(虽然这个特殊操作比正则表达式版本需要更多行,但是使用它可以使涉及树的其他操作变得更容易)。

答案 1 :(得分:1)

re.sub的替换表达式可以是一个函数。编写一个获取匹配文本的函数,将其转换为数字,将其除以100,然后返回结果的字符串形式。