我有一个列表,其中每个元素都包含一个文本数据向量。本质上,我希望代码删除正则表达式后面的文本:第二个“。在各自的向量中。
如果将gsub函数用于正则表达式,我相信它是一个很好的方法。我尝试使用正则表达式来构造要检测的模式(见下文)。
数据:
v<-c("M. le président. La parole est à M. Emile Vernaudon.",
"M.Gabriel Xaaperei. Monsieur le ministre",
"M. Raymond Fornir, rapporteur. La commission") 代码:
Subbed<-gsub("[^((?<=^M. *))]", "X", v)
代码返回以下内容:
[1] "M. XX XXXXXXXXX. XX XXXXXX XXX. M. XXXXX XXXXXXXXX."
[2] "M. XXXXXXX XXXXXXXXX. MXXXXXXX XX XXXXXXXXX XXX"
[3] "M. XXXXXXX XXXXXX XXXXXXXXXX. XX XXXXXXXXXX" 代码不仅考虑了所有的"M“,而且在第二行中也有一个”M“,尽管后面没有”a“。我的预感是,在gsub正则表达式中,工作方式似乎不同--“M”。在我的代码中,R可能会将其理解为“M=”。此外,“查找之后”似乎不是作为锚点,而只是作为附加的标点符号。
预期结果如下:
[1] "M. le président."
[2] "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."任何帮助都很感激。
发布于 2019-06-28 18:48:32
1)子匹配字符串(^)的开头,然后捕获M。下一个匹配空间(如果有的话),然后捕捉到下一个点之前的所有内容。最后匹配所有其他的东西。将其替换为第一个捕获(\1)、一个空格和第二个捕获(\2)。
注意,我们使用的是sub而不是gsub,因为每个组件只有一个整体匹配。而且,它在M之后放了一个空格,即使它还没有。
sub("^(M\\.) *([^.]+\\.).*", "\\1 \\2", v)给予:
[1] "M. le président." "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."2) read.table此解决方案不使用任何正则表达式。我们使用点分隔字段在v中读取,然后使用sprintf将它们组装回一起。
with(read.table(text = v, sep = ".", fill = TRUE, strip.white = TRUE),
sprintf("%s. %s.", V1, V2))给予:
[1] "M. le président." "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."3)粘贴/剪裁/子--它使用几个函数,只使用一个正则表达式,这相对简单。我们从第三个字符开始,将第一个点及其后面的所有内容替换为一个点,修剪空格以防留下任何点,并将M粘贴到开头。
paste("M.", trimws(sub("\\..*", ".", substring(v, 3))))给予:
[1] "M. le président." "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."添加
发布于 2019-06-28 18:50:28
gsub("^([^.]*.[^.]*).*", "\\1.", v)
[1] "M. le président." "M.Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."发布于 2019-06-28 18:46:23
您将正则表达式放在方括号中,R将其解释为一个组,然后将该组中的所有内容都视为"OR“。在此之前还有^,这使得R将其视为"NOT",因此它基本上只查找搜索词中的字符。而且,你没有摆脱你的月经。这是它应该是的正则表达式:
gsub("^(M\\..*?\\.).*","\\1",v)
[1] "M. le président." "M.Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."这将查找M. (句点是转义的),后面是任何内容(未转义)。对于未定次数(*),然后是第二个(转义)周期( ?是为了确保它不贪婪,所以它不会查找最后一个句点,只查找下一个句点)。
它返回到那里的所有东西(\\1),并丢弃其余的。
https://stackoverflow.com/questions/56811778
复制相似问题