2016-10-09 5 views
0

Rのstrapplycを使用して、特定の条件セットに一致する文字列の異なる部分を選択しています。これらは、必要な部分が2つの方法のうちの1つを定義できる文字列の一部を見つけるまで、正常に機能しました。私は欠陥の間のテキストをキャプチャするstrapply文を書くことができstrapply内の正規表現OR文を書く方法R

\t\t\tsome words here\t\t\tDefect: some more words here Action: more words 

:ここ

は気前の\トンを振りかけている文字列の例であり、行動の開始:

strapplyc(record[i], "Defect:(.*?)Action") 

これは、[不具合]と[アクション]の間で選択したテキストを選択して選択します。いくつかのケースでは、文字列へのアクションセクションはありません。これらのケースを取り込むために次のコードを使用しました。私がやろうとしてきた何

strapplyc(record[i], "Defect:(.*?)$") 

は、いずれかのアクションで終わる、または文字列の末尾に($を使用して)というテキストをキャプチャしています。

これは失敗し続けるビットです。いずれのオプションでも何も返しません。ここに失敗したコードがあります:

strapplyc(record[i], "Defect:(.*?)Action|$") 

私が間違っているかどうか、あるいはより良い解決策が大いに評価されるでしょう。

+0

交替をグループ内に入れる必要があります。そうでなければ、最初の選択肢は「欠陥:(。*?)アクション」で、2番目は '$'です。あなたはそれを 'Defect:(。*?)(?:Action | $)'と書き換えることができます。あなたの正規表現のより効率的なバージョンは 'Defect:((?:[^ A] | A(?!ction))*)') ' –

+0

' 'Defect:また、Action:の後ろに '' gsub( "。* Defect:| Action。*"、 ""、x) 'を実行し、' Action'を省略することもできます。 –

答えて

2

をあなたがアップのためにしている場合より効率的なソリューションであれば、*。これはAではありませんかction続いAとされない任意の文字の量に続いてDefect:に一致する

Defect:((?:[^A]+|A(?!ction))*) 

:あなたのようなパターンをマッチングし、アンロール。これにより、レイジードットマッチングに必要な拡大が回避されます。 Actionまたは文字列の最後にヒットしたときのマッチングを停止するので、両方の方法で動作します。

Wiktorによって示唆されるように、あなたも少し速く、多くのA sが文字列内にあるときである

Defect:([^A]*(?:A(?!ction)[^A]*)*) 

を使用することができます。

偽の初期一致を避けるには、A(?!ction:)またはA(?!ction\s*:)を使用することを検討してください。

+0

良いアプローチですが、私はそれを["Defect:([^ A] *(?:(A!ction)[^ A] *)*)'](https://regex101.com/r/Ugx3hS/1)に設定する必要があります。 –

+0

@WiktorStribiżewありがとうございます。 '[^ A] +'の代わりに私のパターン( '[^ A]')に間違いがあり、それはもっと多くのステップを踏み出しました。私はあなたの提案を統合しました。これは少しステップを取るように見えますが、もはや大きな問題ではありません。 –

1

代替演算子|は、優先順位が最も低い正規表現演算子です。正規表現Defect:(.*?)Action|$は実際にはDefect:(.*?)Action$の組み合わせであることを意味します。空の文字列は$の正規表現であるため、正規表現は空文字列を返します。

Defect:(.*?)Action|Defect:(.*?)$ 

それとも、Sebastian Proske said in the commentsとしてグループにAction|$を囲むことができます:

それを解決するには、ORで正規表現にDefect:(.*?)ActionDefect:(.*?)$を結合する必要があり

Defect:(.*?)(?:Action|$)