在Python中如何对正则表达式的输出进行简单的数学运算?

7

能否对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,或者是否可以使用re实现。

你有什么想法解决这个问题吗?感谢你的帮助!


1
你尝试过将字符串转换为整数吗? - erbridge
正则表达式用于文本操作。为了实现这一点,我认为不得不将字符串转换为整数,然后再除以100。 - andrefsp
2
顺便提一下,这看起来像是 Newick 格式(除了在 Newick 格式中,像“words”或“morewords”这样的单个节点通常不会有引导置信度)。您可能会更轻松地使用 Newick 解析器执行其他操作,例如 BioPython 中的解析器,而不是使用正则表达式。 - David Robinson
是的,你说得对--我正在将Newick树中的自举值除以100。谢谢建议。 - chimeric
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")

虽然使用这种特定的操作所需的代码行数比正则表达式版本要多,但涉及树的其他操作可能会更容易实现。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接