0

ドキュメントで、アルファベットと数字を含む 12 桁の文字列の出現箇所を探しています。文字列の例: 「PXB111X2206」

以下を使用して、Rでこの文字列を含む行番号を取得しようとしています:

FileInput = readLines("File.txt") 
prot_pattern="([A-Z0-9]{12})";
prot_string<-grep(prot_pattern,FileInput)
prot_string

これは、すべて大文字のタイトルを含むドキュメントにヒットし、「CONCENTRATIO」という単語を含む行が返されるまではうまくいきました

探している文字列は「PXB111X2206」です。grep が文字列「PXB111X2206」を含む行番号を返すことを期待しています。ただし、「CONCENTRATIO」という単語を含む行番号が返されます。

上記の私の表現のどこが間違っていますか? 私がここで間違っていることは何か分かりますか?

入力例を次に示します。ここで説明する各設計目標は非常に重要ですが、プロジェクトを成功させるために必要なことの 1 つの側面にすぎません。

成功するプロジェクトとは、プロジェクトの目標が早い段階で特定され、すべてのビル システムの相互依存性が計画およびプログラミング段階から同時に調整されるプロジェクトです。

集中:

設計目標の集中領域: アクセス可能性、美学、費用対効果、>機能/運用、歴史的保存、生産性、安全/安全、および持続可能性、および >それらの相互関係を理解し​​、評価し、適切に適用する必要があります。

これらの設計目標のそれぞれは、設計目標ドキュメント番号に示されています。>PXB111X2206. >

よろしくお願いします、シマック

4

2 に答える 2

3

非常に単純なタスクである式に対して非常に強力なツールを使用しています

[A-Z0-9]{12}

は、「CONCENTRATIO」という単語など、12 サイズの英数字の大文字の文字列と一致しますが、「PXB111X2206」は 12 シンボルの長さでさえないため、一致することはありません。「PXB111X2206」にのみ一致させたい場合は、正規表現自体としてのみ使用する必要があります。たとえば、ファイルの内容が次の場合:

foo
CONCENTRATIO. 
bazz
foo bar bazz PXB111X2206 foo bar bazz
foo 
bar
bazz

そして、あなたが使用します:

grep('PXB111X2206',readLines("File.txt"))

その場合、R は希望どおりに 4 行目のみに一致します。

編集

その特定のパターンを探している場合は、次を試してください。

grep('[A-Z]{3}[0-9]{3}[A-Z]{1}[0-9]{4}',readLines("File.txt"))

その式は、「AAADDDADDDD」のような文字列に一致します。ここで、A は大文字、D は数字です。正規表現には、グループ (角括弧内の記号) と数量詞 (角括弧内の数字) が含まれています。記号は式を受け入れますが、量指定子が存在しない場合は 1 であると想定します。

于 2013-07-23T18:53:25.747 に答える
0

正規表現の意味を見てみましょう。[A-Z0-9]大文字の文字または数字を{12}意味し、前の式が正確に 12 回出現する必要があることを意味します。文字列CONCENTRATIOは 12 文字の大文字なので、grep がそれを取得しても不思議ではありません。文字だけまたは数字だけに一致する一致を取り出したい場合は、次のようなものを試すことができます

allleters <- grep("[A-Z]{12}",strings)
allnumbers <-grep("[0-9]{12}",strings)
both <- grep("[A-Z0-9]{12}",strings)

あなたが望んでいた試合は、次のようなものになります

both <- both[!both %in% union(allletters,allnumbers)]

より優れた正規表現を持つ人は、より洗練されたソリューションを持っているかもしれませんが、これもうまくいきます。

于 2013-07-23T16:05:28.883 に答える