2013-08-06 26 views
0

我想編寫一個特定的正則表達式以特定的文件格式執行下列操作。正則表達式 - Perl:添加特異性

它應該能夠檢查與正則表達式的第三場是否只是一個O或有任何以下的O.

目前,我用下面的語法如下所示:

if ($line !~ /^ATOM\s+\d+\s+(O)/) 
    { 

    } 

你們可以幫我嗎?

ATOM  284 OD1 ASN 1 34 -7.92000 -6.74600 -4.73800 O_2 1 2 -0.55000 0 0 
    ATOM  308 O LEU 1 35 -10.48500 -13.59200 -8.35100 O_2 1 2 -0.51000 0 0 

我希望能夠打印出從文件中包含O.後的東西(如OD1線)線。我應該能夠與只是一個O.

+0

你能再詳細一點嗎?從你的問題來看,你不清楚你實際期望的是什麼?該文件的預期輸出是什麼? –

+0

如果您正在解析pdb文件,請使用substr爲每個字段提取字符。使用正則表達式解析值無效。 – wespiserA

回答

0

您目前使用的!~不匹配。如果你想匹配,你必須將其更改爲=~。你也不需要括號是O()用於捕獲組。如果你想捕捉組,你可以做(​​O [A-Za-z0-9])。

if ($line =~ /^ATOM\s+\d+\s+O/) 
# we don't care what's after the O, could be nothing or some characters 

if ($line =~ /^ATOM\s+\d+\s+(O[a-zA-Z0-9]*)/) 
# this will capture OD1 or just O in $1 

,或者如果你想看看是否0後有字符,你可以使用

if ($line =~ /^ATOM\s+\d+\s+(O[a-zA-Z0-9]+)/) 
# this would only capture OD1 in $1 
0

您可以使用split打出一個領域:

my $field = (split /\s+/, $line)[2]; 

這樣可以使正則表達式更容易實現。另外,它使你在做什麼比較明顯的:

if ($field =~ /^O/) { 
    here be dragons... 
} 

事實上,你可能會想這樣做,您的所有領域,使其更易於操作。由於我不知道你的意思領域,我只是叫他們$fld1$fld2,等等。現在

my ($fld1, $fld2, $fld3, $fld4, ...) = split /\s+/, $line; 
if ($fld3 =~ /^O/) { 
    here be dragons... 
} 

,你可以很容易地參考您的個人領域在你的程序。

0

,如果你不喜歡使用正則表達式,你可以使用拆分爲@大衛-W說

my @fields = split /\s+/, $line; 
##now $field[2] 
if ($fields[2] ne 'o'){ 
    ##this line has o and other letters 
} 

但是這會比正則表達式慢得多特別是對於大型數據文件

爲正則表達式您的數據文件以空格(apperantly)開始 所以你的正則表達式應該是爲以下

if ($line !~ /^\s+ATOM\s+\d+\s+(O)\s+/){ 
    ##this line has o with other letters beside it 
} else { 
    ## this line only has o in field 3 
} 

加入^ \ S +開頭或完全刪除^大關

$line !~ /ATOM\s+\d+\s+(O)\s+/ 

然後添加\ S + O後(末),以確保它後面的空間立即

,如果你不感興趣的捕捉領域珍惜你更好捕獲組(O)

if ($line !~ /ATOM\s+\d+\s+O\s+/) { 
    #... 
} else { 
    #... 
}