【问题标题】:Searching multiple times a pattern in a string via regex in python通过python中的正则表达式在字符串中多次搜索模式
【发布时间】:2014-02-04 00:12:28
【问题描述】:

当使用正则表达式 .search() 时,我发现它只匹配字符串中第一次出现的模式,并且需要在字符串 .findall() 中找到该模式的所有重复。

所以,我的问题是:给出两个相互“对话”的不同字符串,我需要在字符串中找到特定模式的每次出现,然后获取该模式的位置并从中获取该位置的元素第一个字符串,然后打印它们或保存在新列表中。

为了更清楚,我将提供一个示例:

ACGCUGAGAGGACGAUGCGGACGUGCUUAGGACGUUCACACGGUGGAAGUUCACAACAAGCAGACGACUCGCUGAGGAUCCGAGAUUGCUCGCGAUCGG

...((.((....(((..((....(((((.((((.(((((...))))).)))).....)))))..))..))))).))((((((((....)))).))))..

这是两个字符串,第一个是字母,第二个是点和括号。我想找到的由正则表达式编译的模式是“((。+))”。一旦在第二个字符串上找到模式,然后获取模式的位置并返回第一个字符串的相关元素。有了这些输入,我希望有 2 个不同的输出:CACGG 和 GAUUGC。

到目前为止我写的代码是这样的:文件中的行:

 if (line[0] == "A") or (line[0] == "C") or (line[0] == "T") or (line[0] == "G"): 
    apt.append(line) 
    count = count + 1 
 else: 
    line = line.strip() 
    pattern = "(\(\.+\))" 
    match = re.search(pattern, line) 
    if match: 
       loop.append(apt[count][match.start():match.end()]) 
    else: 
       continue

这显然只检索文件第二行中出现的模式的第一个匹配项,只给出 CACGG 作为输出。

如何修改代码以检索模式的第二次出现?

谢谢,感谢您的帮助

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    如果您不介意使用re.finditer

    >>> import re
    
    >>> str1 = "ACGCUGAGAGGACGAUGCGGACGUGCUUAGGACGUUCACACGGUGGAAGUUCACAACAAGCAGACGACUCGCUGAGGAUCCGAGAUUGCUCGCGAUCGG"
    >>> str2 = "...((.((....(((..((....(((((.((((.(((((...))))).)))).....)))))..))..))))).))((((((((....)))).)))).."
    
    >>> pat = re.compile(r"\([^()]+\)")
    
    >>> for m in pat.finditer(str2):
    ...     print '%02d-%02d: %s' % (m.start(), m.end(), m.group())
    ...     print str1[m.start():m.end()]
    
    38-43: (...)
    CACGG
    83-89: (....)
    GAUUGC
    

    ideone demo

    正则表达式\([^()]+\) 获取括号中的部分,其中没有更多括号。 [^()] 是一个不匹配任何括号的否定类。

    顺便说一句,您也可以使用该模式:\(\.+\)


    在你的情况下,它可能是这样的:

    if (line[0] == "A") or (line[0] == "C") or (line[0] == "T") or (line[0] == "G"): 
        apt.append(line) 
        count = count + 1 
    else: 
        line = line.strip() 
        pattern = r"\(\.+\)" 
        for match in pattern.finditer(line):
            loop.append(apt[count][match.start():match.end()])
    

    如果在读取文件之前编译模式会更快。

    我无法测试此代码,但请记住,找到的每个部分都将附加到 loop

    【讨论】:

    • 我也可以将此逻辑应用于包含多个带字母的字符串的文件,每个字符串后跟多个带点和括号的字符串?
    • @Mojito88 是的,你应该可以使用这个循环来做到这一点。
    • @Mojito88 好的,我拿了你当前的代码并稍微编辑了一下。
    • 非常感谢@Jerry。你的回答对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多