2014-09-27 4 views
2

У меня есть три файла, содержащие набор строк. File1 и File2 содержат подстроку File3. Я хочу вычитать строку из File3, которая находится между подстроками в File1 и File2. Пожалуйста, смотрите мой пример ниже:Извлечь часть строки, которая соответствует двум подстрокам

File1 (подстроку 1):

head(fivep$V2) 
[1] UGAGGUAGUAGUUUGUACAGUU UGAGGUAGUAGUUUGUGCUGUU ACAUACUUCUUUAUAUGCCCAUA UAGCAGCACAUCAUGGUUUACA 
[5] GGGUUCCUGGCAUGCUGAUUU AGAGCUUAGCUGAUUGGUGAAC 

Файл2 (подстроки 2)

head(threep$V2) 
[1] ACUGUACAGGCCACUGCCUUGC CUGCGCAAGCUACUGCCUUGCU UGGAAUGUAAAGAAGUAUGUAU CGAAUCAUUAUUUGCUGCUCUA 
[5] AUCACAUUGCCAGGGAUUACC UUCACAGUGGCUAAGUUCUGC 

file3

head(hairpin$V2) 
[1] UACACUGUGGAUCCGGUGAGGUAGUAGGUUGUAUAGUUUGGAAUAUUACCACCGGUGAACUAUGCAAUUUUCUACCUUACCGGAGACAGAACUCUUCGA 
[2] AUGCUUCCGGCCUGUUCCCUGAGACCUCAAGUGUGAGUGUACUAUUGAUGCUUCACACCUGGGCUCUCCGGGUACCAGGACGGUUUGAGCAGAU  
[3] AAAGUGACCGUACCGAGCUGCAUACUUCCUUACAUGCCCAUACUAUAUCAUAAAUGGAUAUGGAAUGUAAAGAAGUAUGUAGAACGGGGUGGUAGU 
[4] UAAACAGUAUACAGAAAGCCAUCAAAGCGGUGGUUGAUGUGUUGCAAAUUAUGACUUUCAUAUCACAGCCAGCUUUGAUGUGCUGCCUGUUGCACUGU 
[5] CGGACAAUGCUCGAGAGGCAGUGUGGUUAGCUGGUUGCAUAUUUCCUUGACAACGGCUACCUUCACUGCCACCCCGAACAUGUCGUCCAUCUUUGAA 
[6] UCUCGGAUCAGAUCGAGCCAUUGCUGGUUUCUUCCACAGUGGUACUUUCCAUUAGAACUAUCACCGGGUGGAAACUAGCAGUGGCUCGAUCUUUUCC 

Пример:

        String in File1      String in File2 
           AGGGCUUAGCUGCUUGUGAGCA     UUCACAGUGGCUAAGUUCCGC 
String in File3  CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG 

Выход из этого примера:

GGGUCCACACCAAGUCGUG 
+0

какие две подстроки? –

+0

Разместите свой код здесь, а затем мы можем посмотреть, где именно вы столкнулись с проблемой. – Praveen

ответ

1

Использование qdapRegex в R:

f1 <- "AGGGCUUAGCUGCUUGUGAGCA" 
f2 <- "UUCACAGUGGCUAAGUUCCGC" 
f3 <- "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG" 

library(qdapRegex) 
rm_between(f3, f1, f2, extract=TRUE) 

## [[1]] 
## [1] "GGGUCCACACCAAGUCGUG" 

Как следует из названия rm_between удаляют или захватывает элементы между левой и правой границей. Используйте extract = TRUE, чтобы захватить строку между границами. Возвращаемое значение - это список, так как для каждой строки может быть несколько исключений. Если это нежелательно, используйте unlist, как в unlist(rm_between(f3, f1, f2, extract=TRUE)).

2

Вот решение в R:

file1 <- "AGGGCUUAGCUGCUUGUGAGCA" 
file2 <- "UUCACAGUGGCUAAGUUCCGC" 
file3 <- "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG" 

# create a regular expression 
pattern <- paste0(".*", file1, "(.*)", file2, ".*") 

# extract the substring 
sub(pattern, "\\1", file3) 
# [1] "GGGUCCACACCAAGUCGUG" 
+0

Как это работает, если файлы содержат несколько строк? – user3741035

+0

@ user3741035 Вы хотите использовать все комбинации строк в файле 1 и файле 2? –

+0

да, все комбинации. – user3741035

1

В python

>>> a='AGGGCUUAGCUGCUUGUGAGCA' 
>>> b='UUCACAGUGGCUAAGUUCCGC' 
>>> c='CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG' 
>>> regex = a + '(.*?)' + b 
>>> regex 
'AGGGCUUAGCUGCUUGUGAGCA(.*?)UUCACAGUGGCUAAGUUCCGC' 
>>> re.findall(regex,c) 
['GGGUCCACACCAAGUCGUG'] 
1

Попробуйте это strapplyc в gsubfn. Мы предположили, что существует только один экземпляр s1 и s2, или если существует несколько экземпляров, в которых вы хотите получить строку между первым экземпляром s1 и последним экземпляром s2. Если может быть несколько экземпляров, и вы хотите что-то другое, добавьте это в вопрос.

s1 <- "AGGGCUUAGCUGCUUGUGAGCA" 
s2 <- "UUCACAGUGGCUAAGUUCCGC" 
s3 <- "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG" 

library(gsubfn) 
fn$strapplyc(s3, "$s1(.*)$s2", simplify = TRUE) 
## [1] "GGGUCCACACCAAGUCGUG" 
+0

Я отредактировал мой вопрос. У меня несколько строк в файлах 1, 2 и 3. – user3741035

1

В питоне
`

 
    string1 = "AGGGCUUAGCUGCUUGUGAGCA" 
    string2 = "UUCACAGUGGCUAAGUUCCGC" 
    string_main = "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG" 
    print string_main[string_main.find(string1)+len(string1):string_main.find(string2)]

4

В Perl вы можете попробовать этот код:

use strict; 
use warnings; 

my $file1 = "AGGGCUUAGCUGCUUGUGAGCA"; 
my $file2 = "UUCACAGUGGCUAAGUUCCGC"; 
my $file3 = "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG"; 

my ($result) = $file3 =~ /$file1(.*?)$file2/; 

print $result; 

Выходов:

GGGUCCACACCAAGUCGUG 
1

Основу вашего заданного входа, следующий будет работать ,

f1 <- "AGGGCUUAGCUGCUUGUGAGCA" 
f2 <- "UUCACAGUGGCUAAGUUCCGC" 
f3 <- "CUGAGGAGCAGGGCUUAGCUGCUUGUGAGCAGGGUCCACACCAAGUCGUGUUCACAGUGGCUAAGUUCCGCCCCCCAG" 
strsplit(f3, paste(f1, f2, sep='|'))[[1]][2] 
# [1] "GGGUCCACACCAAGUCGUG" 
Смежные вопросы