【问题标题】:Iterating through regular expressions in Python在 Python 中遍历正则表达式
【发布时间】:2014-05-10 13:14:28
【问题描述】:

我对 python 有基本的了解(完成了一节课),但我不确定如何处理下一个脚本。我有两个文件,一个是 newick 树 - 看起来像这样,但要大得多:

(((1:0.01671793,2:0.01627631):0.00455274,(3:0.02781576,4:0.05606947):0.02619237):0.08529440,5:0.16755623);

第二个文件是一个制表符分隔的文本文件,看起来像这样,但要大得多:

1 \t Human
2 \t Chimp
3 \t Mouse
4 \t Rat
5 \t Fish

我想用文本文件中的物种名称替换newick文件中的序列ID号(只有冒号后面的)来创建

(((Human:0.01671793,Chimp:0.01627631):0.00455274,(Mouse:0.02781576,Rat:0.05606947):0.02619237):0.08529440,Fish:0.16755623);

我的伪代码(打开两个文件后)看起来像

for line in txtfile:
    if line[0] matches \(\d*\ in newick:
        replace that \d* with line[2]

任何建议将不胜感激!

【问题讨论】:

    标签: python regex search replace iteration


    【解决方案1】:

    这可以通过定义一个在正则表达式\(\d*: 的每次匹配上运行的回调函数来完成。

    这里有一个来自https://docs.python.org/2/library/re.html#text-munging 的(不相关的)示例,说明了回调函数如何与执行正则表达式替换的re.sub() 一起使用:

    >>> def repl(m):
    ...   inner_word = list(m.group(2))
    ...   random.shuffle(inner_word)
    ...   return m.group(1) + "".join(inner_word) + m.group(3)
    >>> text = "Professor Abdolmalek, please report your absences promptly."
    >>> re.sub(r"(\w)(\w+)(\w)", repl, text)
    'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'
    >>> re.sub(r"(\w)(\w+)(\w)", repl, text)
    'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'
    

    【讨论】:

    • 这和这个问题到底有什么关系?
    • 这是建议的解决方案,有什么不清楚的地方?它是这样工作的:codepad.org/gGcb5mdq
    • 您的键盘很有意义,将可调用对象传递给re.sub 是可行的方法......我不明白通过文本处理来演示它是如何有用的。您可能已经说过这可以通过定义一个在正则表达式的每个匹配项上运行的回调函数来完成并将其保留在那个...
    【解决方案2】:

    您也可以使用findall

    import re
    
    s = "(((1:0.01671793,2:0.01627631):0.00455274,(3:0.02781576,4:0.05606947):0.02619237):0.08529440,5:0.16755623)"
    
    rep = {'1':'Human',
    '2':'Chimp',
    '3':'Mouse',
    '4':'Rat',
    '5':'Fish'}
    
    for i in re.findall(r'(\d+:)', s):
        s = s.replace(i, rep[i[:-1]]+':')
    
    >>> print s
    (((Human:0.01671793,Chimp:0.01627631):0.00455274,(Mouse:0.02781576,Rat:0.05606947):0.02619237):0.08529440,Fish:0.16755623)
    

    【讨论】:

    • 感谢您的回答。不幸的是,一旦你有超过 9 个物种的列表,它就会变得相当混乱。上面的解决方案就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2017-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多