正则表达式只找到一个匹配

时间:2015-11-24 14:51:31

标签: regex

我有以下文字:

TRANSCRIPT    WS000006.1 (802 nt)
PARENT_CONTIG WS000006
FEATURES             Location/Qualifiers
     source          1..802
                     /organism="Winter skate"
     CDS             complement(3..443)
                     /protein_id="WS000006.1_orf1"
                     /orf_type="5prime_partial"
                     /blastp_hit_swissprot="MALD2_HUMAN"
                     /blastp_hit_uniprot="Q8N4S9"
                     /blastp_hit_name="MARVEL domain-containing protein 2"
                     /blastp_hit_identity="61.29%"
                     /blastp_hit_evalue="5e-47"
                     /pfam_hit_accession="PF07303.8"
                     /pfam_hit_id="Occludin_ELL"
                     /pfam_hit_name="Occludin homology domain"
                     /pfam_hit_evalue="7.3e-28"
                     /translation="AKSFPSRCNGAGTLNKSIPAGFIPKPLIVPDYVTKYPKIETAEE
                     RERYKGVFNDQYAEYRELHTEIYVANRKFGELKTLIERLPHYVETSEEHR
                     RIMKILEDYKEKKNDPTFVEKKQRCTYLKNKLSYIKLRIQEYDLDCDSSS
                     SY*"

                     /go_cellular_component="plasma membrane|0005886"
                     /go_cellular_component="tight junction|0005923"
                     /go_biological_process="cell-cell junction organization|0045216"
                     /go_biological_process="sensory perception of sound|0007605"
ORIGIN
        1 CTGCCAAGAG CTTCCCGTCG CGGTGCAACG GTGCGGGCAC GCTCAACAAG TCCATTCCCG 
       61 CAGGATTCAT CCCGAAGCCT CTCATCGTTC CCGATTACGT CACAAAGTAC CCGAAGATTG 
      121 AGACTGCAGA GGAGAGAGAA CGGTACAAGG GTGTGTTCAA TGACCAGTAC GCGGAATATC 
      181 GGGAGCTACA CACTGAGATC TATGTGGCCA ACAGGAAGTT TGGGGAACTG AAGACTCTGA 
      241 TCGAGAGACT GCCCCACTAC GTCGAGACAT CAGAGGAGCA CAGACGTATA ATGAAGATCC 
      301 TCGAAGATTA CAAGGAGAAA AAGAATGACC CAACATTTGT GGAGAAGAAG CAACGATGCA 
      361 CTTACCTGAA GAACAAACTC TCGTACATCA AGCTGCGAAT CCAGGAGTAT GATCTAGACT 
      421 GTGACTCCTC CAGCAGTTAC TGAACAAAAT CTCACATCAT TCATCATTAA TATTTTCATT 
      481 ATTTTTCTTC TAGTGCAGAT AGGATTCATT TGGGCCGTGG AGTGTGTATG TATGTGTGTG 
      541 TGTGTATGTA TGTGTGCGTG TGTACGTATA TGTGTGTGTG TACACCGTGT TGTGTGTACC 
      601 TGTGTGTACG TGTATGTATG TGTGTGTACG TGTGTGTGTG CGCATGATTA TATGTGTGTG 
      661 TGAATATGAG TGCGGGTGTG TGCATATGTG TGTGTGTGAA ATAATATAGT ATTTCGTAGT 
      721 TCAGAGCTTA TTTGTTAAGT TTAATAGCGT GATGGCTGTC AGGAAGAAGC TGTTCCTCAA 
      781 TGTAGATGTT ACAGTTTTCA GT
//

我想得到以/ go _

开头的行

所以我构建了以下正则表达式:\/go_.+?=".+?" 在我看来应该得到/ go_位,然后是=字符之前的其余部分,然后是=字符之后的最后部分,它在引号内。

然而,在在线正则表达式测试器(https://regex101.com/)上,我只是将第一个/ go_行作为匹配。我怎样才能匹配所有的线?

感谢。

2 个答案:

答案 0 :(得分:1)

模式可能是:

\s*\/go_.*

但是,您需要将g全局)传递给flag以捕获所有匹配项: https://regex101.com/r/lW7mQ5/1。根据您的编程语言和上下文,您可能还需要传递m多行)选项并将模式更改为^\s*\/go_(请注意^m被传递时的开头)

顺便说一下。请注意如何在SO上提问。你应该a)创建尽可能短的例子,而不是仅仅粘贴大量文本,b)解释你正在做什么,用哪种编程语言和你到目前为止所尝试的内容(!)。

答案 1 :(得分:0)

在该特定的正则表达式引擎中,在第二个文本输入框中使用g参数(在/之后)将使其查找所有出现的内容。这是因为该引擎不是逐行搜索您的字符串,而是作为要搜索的单个单一blob文本。因此,它找到第一个匹配并退出。 g开关告诉它找到所有匹配。

这样做的结果是,您需要了解如何使用您正在使用的目标语言扫描多行字符串以查找所有匹配项。这里有一些Ruby可以完成这项任务:

s=<input string above>
s.scan(/\/go_.+?=".+?"/).each do |match|
    puts match
end

输出是:

/go_cellular_component="plasma membrane|0005886"
/go_cellular_component="tight junction|0005923"
/go_biological_process="cell-cell junction organization|0045216"
/go_biological_process="sensory perception of sound|0007605"