如何在python中提取与模式匹配的两个连续行
我试图从如何在python中提取与模式匹配的两个连续行,python,Python,我试图从test.txt中提取匹配两种不同模式的行 首先,我想提取与fbat-v1匹配的行,然后匹配p值(双面)下方的对应行 这是我尝试过的代码,但它只提取第一个匹配项 import re file = open('test.txt') for line in file: match = re.findall('^>> fbat -v1', line) if match: print line 我也试着在R中这样做,但似乎R不太适合这样做。我不熟悉
test.txt
中提取匹配两种不同模式的行 首先,我想提取与fbat-v1匹配的行,然后匹配p值(双面)下方的对应行 这是我尝试过的代码,但它只提取第一个匹配项
import re
file = open('test.txt')
for line in file:
match = re.findall('^>> fbat -v1', line)
if match:
print line
我也试着在R中这样做,但似乎R不太适合这样做。我不熟悉python,所以请有人帮我解决这个问题。
先谢谢你
test.txt:
>> fbat -v1 1:939467:A:G
trait STATUS; offset 0.150; model additive; test bi-allelic; minsize 2; min_freq 0.000; p 1.000; maxcmh 1000
Marker afreq fam# weight S-E(S) Var(S) Z P
----------------------------------------------------------------------------------------
Weighted FBAT rare variant statistics for the SNPs:
W Var(W) Z p-value(2-sided)
----------------------------------------------------
0.400 0.240 0.816 4.14216178e-01
----------------------------------------------------
>> fbat -v1 1:941298:C:T 1:941301:G:A 1:941310:C:T 1:941324:G:A
trait STATUS; offset 0.150; model additive; test bi-allelic; minsize 2; min_freq 0.000; p 1.000; maxcmh 1000
Marker afreq fam# weight S-E(S) Var(S) Z P
----------------------------------------------------------------------------------------
Weighted FBAT rare variant statistics for the SNPs:
W Var(W) Z p-value(2-sided)
----------------------------------------------------
0.333 0.444 0.500 6.17075077e-01
----------------------------------------------------
结果:
>> fbat -v1 1:939467:A:G 0.400 0.240 0.816 4.14216178e-01
>> fbat -v1 1:941298:C:T 1:941301:G:A 1:941310:C:T 1:941324:G:A 0.333 0.444 0.500 6.17075077e-01
当然,您需要处理最后一行,因为如果它与fbat-v1匹配,您将尝试访问不存在的下一行。您可以使用正则表达式从多行中选择所需的数据。由于只有两个样本,很难知道这一个是否匹配所有情况:您的一些数据可能不像样本所显示的那样规则 对于文件中的行:,这不遵循
的一次一行模式,因为您的数据由一束行组成
file = open('test.txt')
data = file.read()
rex = re.compile(r"(>> fbat -v1.+?\n).+?p-value\(2-sided\)\n-+\n(.+?)\n-", re.DOTALL)
for header, numbers in rex.findall(data):
print (header.rstrip(), numbers)
输出为
>> fbat -v1 1:939467:A:G 0.400 0.240 0.816 4.14216178e-01
>> fbat -v1 1:941298:C:T 1:941301:G:A 1:941310:C:T 1:941324:G:A 0.333 0.444 0.500 6.17075077e-01
我顺便注意到您正在使用Python 2。除非这是一次性的,请考虑切换到Python 3。您不应该把时间花在学习Python 2上。如果您不想使用正则表达式,您可以使用generator,它允许您在读取大量数据(和10GB大文件)时减少RAM的使用
f=open(“input.txt”)
#您可以将f.readline()替换为string.splitlines()替换为string_to_parse.splitlines()或f.readlines()
content=(f.readlines()中的行的line.replace(“\n”,”)
结果=[]
尝试:
#如果从文件中读取,可以使用string.splitlines()替换内容
对于内容中的行:
#我们试图找到一个以>>fbat-v1开头的行
如果line.startswith(“>>fbat-v1”):
结果线=线
#跳转线条,直到找到以p值结尾的线条(双面)
而不是下一个(内容)。endswith(“p值(双面)”):
通过
#跳过一行忽略----------------------------------------------------
下一步(内容)
#我们把这一行添加到结果中
结果_行+=下一行(内容)
#最后,我们将结果添加到列表中
result.append(结果\行)
#如果有一个>>fbat-v1在之后没有p值(双面),则会发生这种情况
除停止迭代外:
打印(“>>fbat-v1”之后找不到“p值(双面)”)
#打印结果
打印(“\n”.join(结果))
我在这里使用了一个文件来包含数据(如果它是一个日志文件)不确定我为什么会得到TypeError:“file”对象没有属性“\uu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,我没说会的。注释说明了如何更好地处理文件对象本身。@S3DEV修饰损坏的代码没有什么意义。为什么会出现此错误:file“”,第1行,在NameError中:未定义名称“data”
抱歉,剪切“n”粘贴错误。在read()
调用中出现语法错误,因此数据不存在。
>> fbat -v1 1:939467:A:G 0.400 0.240 0.816 4.14216178e-01
>> fbat -v1 1:941298:C:T 1:941301:G:A 1:941310:C:T 1:941324:G:A 0.333 0.444 0.500 6.17075077e-01