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.."

我期待这个表达式会匹配一个空格,后跟一个(但不是更多)点。但是,无论是一个点还是两个点,字符串都会被替换。我是一个真正的新手,所以可能遗漏了一些明显的东西。即便如此,任何帮助将不胜感激。

问候, 马克西姆

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

您可以删除从最后一个空格到 the 的所有内容,然后在字符串末尾.粘贴 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."

.*>注意和之间的区别.*?>。第一个是“贪婪的”,因为它将匹配所有字符,直到最后一个>。而第二个将在第一个匹配后停止,这在此处是可取的,并且您希望删除每个匹配项。

于 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 回答