如何使用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正向引物1CGAAGCCTGGTGCCCGATTT 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
- 现在,第三行-
它忽略所有内容,直到到达第一组数字,抓取这些数字并跳到下一行(2个新行)。在这种情况下,结果是*?(\d+)+\n{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的(akaX
)标志进行自文档化
这是从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+
@第四鸟啊,对了,我一定忘了清理它们。这应该是一条注释。