Perl регулярное выражение извлекает части строки с несколькими условиями - PullRequest
1 голос
/ 14 апреля 2010

Какое единственное регулярное выражение, которое позволяет мне захватывать весь текст, который идет после are genes и is gene из этого текста

The closest human genes of best are genes A B C
The closest human gene of best is gene A 

Следовательно, я надеюсь извлечь $1, которые содержат

A B C
A 

Попробовал, но не получилось:

$line =~ /The closest .* gene[s] (.*)$/;

Ответы [ 5 ]

4 голосов
/ 14 апреля 2010
$line =~ /The closest .* genes? (.*)$/;
3 голосов
/ 14 апреля 2010

Я думаю, что наиболее явным является:

$line =~ m/best \s (?:is \s gene|are \s genes) \s ([\p{IsUpper}](?: \s [\p{IsUpper} ])*)/x;

Конечно, если вы знаете, что все предложения будут грамматическими, тогда вы можете сделать (?:are|is). И если вы знаете, что у вас будут только гены A-N или что-то еще, вы можете забыть \p{IsUpper} и использовать [A-N].

2 голосов
/ 14 апреля 2010

Используйте не жадные в начале, чтобы уменьшить возможности для сюрпризов. Используйте не захватывая паренов, чтобы сгруппировать альтернативы, которые вас не интересуют. Добавьте ? к письму, чтобы сделать его необязательным. Следовательно, попробуйте это:

$line =~ /The closest .*? (?:is|are) genes? (.*)$/;

Чтобы увидеть, куда вы пошли не так, кстати, просто сравните вышесказанное с тем, что вы изначально пытались.

2 голосов
/ 14 апреля 2010
$ perl -F/genes*/ -ane 'print $F[-1];' file
 A B C
 A
0 голосов
/ 14 апреля 2010

С другими предложениями я хотел бы предложить взглянуть на perllre для регулярных выражений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...