是否可以对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}}。
有关如何解决此问题的任何想法?谢谢你的帮助!
答案 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,然后返回结果的字符串形式。