7

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

我有一个大文件,我需要将 a 后面的数字除以")"100。例如,我将转换以下包含)75and的行)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,或者是否可以使用re.

关于如何解决这个问题的任何想法?谢谢你的帮助!

4

2 回答 2

15

您可以通过提供一个函数作为替换来做到这一点:

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 的 Newick 树解析器来代替,它看起来像这样:

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")

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

于 2013-01-05T23:43:40.923 回答
1

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

于 2013-01-05T23:41:07.737 回答