2

テキスト ファイルを調べて、各行で 2 番目に出現する正規表現パターンを取得する Ruby スクリプトを作成しています。1 行のテキストの例を次に示します。

gi|324021737|ref|NM_001204301.1|    gi|324021738|ref|NP_001191230.1|    100.00  459 0   0   1080    2456    294 752 0.0  905

私が取得しようとしている番号はgi|324021738、上記の例にある番号ですがgi|324021737、行頭にある番号ではありません。これらの値は常に で始まりますがgi|、その後の桁数は異なります。

正規表現に 2 番目に一致したものだけを文字列の配列に追加する最も効率的な方法は何でしょうか?

4

3 に答える 3

2

この正規表現を使用できます: -

"^gi.*?(gi\|\d+).*?$"

グループ 1 を取得します。

于 2012-12-25T21:33:55.917 に答える
2

これはsplit('|')、正規表現よりも適切に処理されます。

array = []

text = 'gi|324021737|ref|NM_001204301.1|    gi|324021738|ref|NP_001191230.1|    100.00  459 0   0   1080    2456    294 752 0.0  905'
array << text.split('|')[4, 2].map(&:lstrip)
=> [["gi", "324021738"]]

パイプ ("|") は、コンマ区切り値ファイル (CSV) と同様に、データベース出力のフィールドを区切るためによく使用されます。

Ruby のCSVはさらに良い選択です。

require 'csv'

text = 'gi|324021737|ref|NM_001204301.1|    gi|324021738|ref|NP_001191230.1|    100.00  459 0   0   1080    2456    294 752 0.0  905'

array = []
CSV.parse(text, :col_sep => '|') do |row|
  array << row[4, 2].map(&:lstrip)
end

array
=> [["gi", "324021738"]]

CSV を使用する理由は、分割よりも優れている可能性があり、特に単純な正規表現よりも優れている可能性があるのは、区切りファイルが別のフィールド内に埋め込まれている場合、区切り文字をエスケープすることが多いためです。その状態をキャプチャする正規表現は、作成および保守が非常に困難です。split間違ったことをする可能性もあります。そのため、CSV のように、事前に構築され、事前にテストされた「車輪」に頼る方がよいのです。

于 2012-12-25T23:32:34.737 に答える
0

@Rohit が投稿した正規表現を理解するのに数秒かかりました。

これは、分割を使用した別の回答です。" " 文字 (スペース) を使用して、文字列をグループに分割します。次に、「|」を使用してインデックス 1 で要素を分割します。インデックス 1 の要素を取得します。これが探している番号です。

s = "gi|324021737|ref|NM_001204301.1|    gi|324021738|ref|NP_001191230.1|    100.00  459 0   0   1080    2456    294 752 0.0  905"
s.split(" ")[1].split("|")[1]

=> "324021738"
于 2012-12-25T23:40:00.250 に答える