1

R の正規表現に問題があります。目標は、R で Markdown/reST/knitr レポート テキスト ファイルを解析して、独自のカスタム コメントを削除することです。これらのコメントは、次の形式で入力されます。

Some sentence is about something <find a citation to this>.

Markdown は HTML タグに <> を使用するため、混乱を避けるために (カスタム関数を使用して) これらのコメントを削除する必要があります。それを行った後、文は次の形式になります。

Some sentence is about something .

最後の単語とドットの間のスペースに注意してください。それを削除するのは簡単ですが、テキストには で始まる R コード (knitr) を組み込んだ reST コメントが含まれる場合があります..

.. {r chunk-name}
.. some R code 
.. ..

したがって、基本的には「。」を置き換える必要があります。前者の場合はそうですが、後者の場合はそうではありません。R 正規表現アトムの繰り返し修飾子を使用してこれを達成します。

gsub(pattern=" \\.{1}",replacement=".",x="Something ..")
[1] "Something.."

この表現は、単一のスペースの後に単一の (ただしそれ以上ではない) ドットが続くものと一致すると予想していました。ただし、ドットが 1 つまたは 2 つあるかどうかに関係なく、文字列は置き換えられます。私はこれが本当に初心者なので、おそらく明らかな何かが欠けています。それでも、どんな助けでも大歓迎です。

よろしく、 マキシム

4

3 に答える 3

3

パターンが一致するとすぐに一致が発生します。パターンが繰り返されていないことを確認するための先送りはありません。それが十分に一般的かどうかはわかりませんが、提供された単一のテストケースでは、否定演算子で文字クラスを使用すると機能します

> gsub(pattern=" \\.[^.]| \\.$",replacement=".",x="Something .")
[1] "Something."
> gsub(pattern=" \\.[^.]| \\.$",replacement=".",x="Something ..")
[1] "Something .."
于 2013-03-20T14:43:44.103 に答える
2

最後のスペースから までのすべてを削除して、文字列の最後に.a を貼り付けることができ.ますよね?

# anything followed by any amount of space followed 
# by < followed by anything until the end of the sentence
paste0(gsub("(.*)[ ].*<.*$", "\\1", tt), ".")
# [1] "Some sentence is about something."

とはいえ、これは本当に読むべきです。

または、マークアップが文の途中で発生し、それらとその周囲のスペースを削除したい場合は、次のようにします。

# remove everything within <...> including < and > 
# and any spaces surrounding them
gsub("[ ]*<.*?>[ ]*", "", tt)
# [1] "Some sentence is about something."

# example:
tt <- ".. some sentences are wrong <bla bla>. But some are <bla bla> right."
gsub("[ ]*<.*?>[ ]*", "", tt)
# [1] ".. some sentences are wrong. But some are right."

と の違いに注意して.*>ください.*?>。最初のものは、最後の > までのすべての文字に一致するという意味で「貪欲」です。一方、2 番目のものは最初の一致の後に停止します。これはここでは望ましいことであり、すべての出現を削除したいと考えています。

于 2013-03-20T14:44:46.043 に答える
1

Perl 正規表現の否定先読みパターンを使用して、目的を達成できます。これは基本的にパターンに一致することを示していますが、このパターンが続いていない場合に限ります。簡単な例:

> gsub(pattern=" \\.(?!\\.)",replacement=".",x="Something .", perl=TRUE)
[1] "Something."
> gsub(pattern=" \\.(?!\\.)",replacement=".",x="Something ..", perl=TRUE)
[1] "Something .."
于 2013-03-21T17:29:31.293 に答える