如何使用Python正则表达式在模式中引用特定术语

如何使用Python正则表达式在模式中引用特定术语,python,regex,for-loop,Python,Regex,For Loop,我的模式是 Forward primer CGAAGCCTGGGGTGCCCGCGATTT Plus 24 1 24 71.81 66.67 4.00 2.00 Reverse primer AAATCGGTCCCATCACCTTCTTAT Minus 24 420 397 59.83 41.67 5.00 2.00 Product length 420 Products on potentially unintended templates >CP049108.1 My

我的模式是

Forward primer
CGAAGCCTGGGGTGCCCGCGATTT Plus 24 1 24 71.81 66.67 4.00 2.00 

Reverse primer
AAATCGGTCCCATCACCTTCTTAT Minus 24 420 397 59.83 41.67 5.00 2.00 

Product length
420 


Products on potentially unintended templates


>CP049108.1 Mycobacterium tuberculosis strain 5005 chromosome, complete genome product length = 495
Forward primer  1        CGAAGCCTGGGGTGCCCGCGATTT  24
Template        1930054  ........................  1930077

Reverse primer  1        AAATCGGTCCCATCACCTTCTTAT  24
Template        1930548  ........................  1930525


product length = 2946
Forward primer  1        CGAAGCCTGGGGTGCCCGCGATTT  24
Template        1927603  .......C....C..T..T...G.  1927626

Reverse primer  1        AAATCGGTCCCATCACCTTCTTAT  24
Template        1930548  ........................  1930525


>CP046728.2 Mycobacterium tuberculosis strain TCDC11 chromosome, complete genome product length = 420
Forward primer  1        CGAAGCCTGGGGTGCCCGCGATTT  24
Template        2150761  ........................  2150784

Reverse primer  1        AAATCGGTCCCATCACCTTCTTAT  24
Template        2151180  ........................  2151157


product length = 2595
Forward primer  1        CGAAGCCTGGGGTGCCCGCGATTT  24
Template        2148586  .......C....C..T..T...G.  2148609

Reverse primer  1        AAATCGGTCCCATCACCTTCTTAT  24
Template        2151180  ........................  2151157


>CP047258.1 Mycobacterium tuberculosis strain TCDC3 chromosome product length = 345
Forward primer  1        CGAAGCCTGGGGTGCCCGCGATTT  24
Template        2166300  ........................  2166323

Reverse primer  1        AAATCGGTCCCATCACCTTCTTAT  24
Template        2166644  ........................  2166621
我需要的是

>CP049108.1 = 495   1930054 1930548 
>CP046728.2 = 420   2150761 2151180
>CP047258.1 = 345   2166300 2166644
我是微生物学家和Python初学者。我试过了

import re
file = open(r"C:\\Users\\Lab\\Desktop\\amplicons\\ETRA", "r")
handle = file.read()
file.close()

pattern1 = re.compile(r'>.{5,10}\.\d')
matches1 = pattern1.finditer(handle)

for match1 in matches1:
    print(match1.group(0))
但我也需要在我的注册号之后加入特定的条款(例如,注册号>CP049108.1)。我也会让你的知识适应我的其他工作

感谢你的帮助和帮助
提前谢谢你

这里有一种方法。正则表达式搜索相当依赖于文本是否与您提供的文件一致

rows = re.findall('(>.{5,10}).*length( = \d*).*\s*.*\s*Template\s*(   \d*).*\s*.*\s*Template\s*( \d*)', handle)
print('\n'.join(''.join(x) for x in rows))

我建议你考虑一下你需要的逻辑,然后写一些规则来帮助你

这是我用来学习正则表达式的一本有用的书。它涵盖了可用于获得所需结果的基本规则:
以下是我的想法-
([\w\d]*?\。\d*?)。+=(\d+)\n.+\n.*?(\d+)。+\n{2}.+\n.*(\d+)

让我们看一个只有一组数据的示例,只要将
global
标志设置为
True
(在
python
中默认设置为
True
),就可以输入粘贴的整个数据并仍然得到结果

>CP049108.1结核分枝杆菌菌株5005染色体,全基因组产物长度=495正向引物1
CGAAGCCTGGTGCCCGATTT 24模板1930054 ........................ 1930077

反向引物1 AAATCGGTCCCATCACTTCTTAT 24模板
1930548 ........................ 1930525

第一组为-
CP049108.1

第二组为-
495

第三组为-
1930054

第四组(也是最后一组)将是-
1930548

当然,现在您可以将整个数据重新构造为您想要的样子,如果您正在从文本文件读取数据,您可以使用此代码段-

重新导入
打开('test.txt','r')作为文件:
content=file.read()
pattern=re.compile(r'>([\w\d]*?\。\d*?)。+=(\d+)\n.+\n.*?(\d+)。+\n{2}.+\n.*(\d+))
对于pattern.finditer(内容)中的匹配:
output='>{}={}{}'。格式(match.group(1)、match.group(2)、match.group(3)、match.group(4))
打印(输出)
如果我准确地输入您提供给
test.txt
的数据集,我会得到这个输出-

>CP049108.1 = 495   1930054 1930548
>CP046728.2 = 420   2150761 2151180
>CP047258.1 = 345   2166300 2166644
正则表达式解释
(\w+\.\d+)+=(\d+)\n.+\n.*(\d+).+\n{2}.+\n.*(\d+)

  • 让我们先分析第一行-
    >(\w+\.\d+。+=(\d+)\n

    首先,它匹配
    CP049108
    ,直到找到
    (点)为止,然后匹配下一个数字,在本例中-
    1
    ,直到找到
    =
    为止。然后,它将这些内容组合在一个捕获组中,以获得
    CP049108.1

    稍后,它将抓住
    =
    后面的数字并转到下一行,在本例中为
    495

  • 第二行的时间-
    +\n

    是的,第二行被忽略了

  • 现在,第三行-
    *?(\d+)+\n{2}

    它忽略所有内容,直到到达第一组数字,抓取这些数字并跳到下一行(2个新行)。在这种情况下,结果是
    1930054

  • 现在,第四行-
    +\n

    这也被忽略了

  • 最后一行-
    *?(\d+)

    这与第三行的工作原理完全相同,结果是
    1930548

看看这本书

这就是您需要的:

matches=re.findall(r'(>.{5,10}\.\d).*?( = \d+).*?Template.*?( \d+).+?( \d+)', handle, re.DOTALL)
["".join(x) for x in matches]

如您所见,在正则表达式中使用圆括号声明了四个组。每组将获取输出的四个部分,用空格分隔。您将加入此结果以获得所需的输出。

您可以匹配以下正则表达式,然后提取三个捕获组的内容:

r'^(>CP\d{6}\.\d).+?\bproduct +length += +(\d+).*?^Template +(\d+).*?^Template +(\d+)'gms

这可以通过使用Python的(aka
X
)标志进行自文档化

这是从Perl的自由间隔模式派生出来的,我将使用它,因为我不熟悉Python。不懂Perl的读者可以很好地理解这一点

/
^                        # match beginning of line        
(>CP\d{6}\.\d)           # match '>CP', 6 digits, '.', 1 digit in cap group 1  
.+?                      # match 0+ characters, lazily (`?`)
\b                       # match a word break               
product\ +length\ +=\ +  # match 'product', 1+ spaces, 'length', 1+ spaces,
                         #   '=', 1+ spaces 
(\d+)                    # match 1+ digits in cap group 2
.*?                      # match 0+ characters, lazily (`?`)
^Template\ +             # match beginning of line, 'Template', 1+ spaces 
(\d+)                    # match 1+ digits in cap group 3
.*?                      # match 0+ characters, lazily (`?`)
^Template\ +             # match beginning of line, 'Template', 1+ spaces 
(\d+)                    # match 1+ digits in cap group 4                
/xgms                    # free-spacing, global, multiline, single-line modes

链接中给出了不同模式的含义。在自由间距模式下,在解析正则表达式之前,将删除字符类之外的非转义空格。因此,必须保护属于表达式一部分的空格,例如“乘积”和“长度”之间的空格。我选择在这里转义它们,但其他选项是将每个空格放在字符类中(
[]
),使用Unicode表达式
\p{space}
[[:space:\\
或者,如果合适的话,
\s
(空白字符).

1000000谢谢!@ChooseElbunswansakul欢迎来到stackoverflow!您应该通过单击答案旁边的勾号将答案标记为已接受。这确保下一个搜索问题的人立即知道什么有效:)在这部分
([\w\d]*?\。\d*?)
字符类中的
\w
也与
\d
匹配。你不必使量词不贪婪,因为
\w
\d
不能跨越点或空间边界。你可以使用
(\w+\.\d+
@第四鸟啊,对了,我一定忘了清理它们。这应该是一条注释。