如何使用 gsub 和正则表达式删除文本向量的一部分

How to delete parts of a textual vector using gsub and regular expressions

我有一个列表,其中每个元素都包含一个文本数据向量。 本质上,我希望代码删除正则表达式之后的文本:第二个“.”。在各自的向量中。

我相信如果与正则表达式结合使用,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)

代码returns如下:

[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",尽管它后面没有跟“.”。 我的直觉是,在 gsub 中,正则表达式的工作方式似乎有所不同——我代码中的 "M." 可能会被 R 读取为 "M|." 此外,Lookaround 之后的 ^ 似乎不能用作锚点,但是只是作为一个额外的标点符号。

期望的结果如下:

[1] "M. le président."
[2] "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."

非常感谢任何帮助。

您将正则表达式放在方括号内,R 将其解释为一个组,然后确实将该组中的所有内容都视为 "OR"。您还在其前面添加了 ^,这使得 R 将其视为 "NOT",因此它基本上会查找除搜索词中的字符以外的任何内容。 此外,您没有逃过月经。这是正则表达式,它应该是:

gsub("^(M\..*?\.).*","\1",v)
[1] "M. le président."               "M.Gabriel Xaaperei."           
[3] "M. Raymond Fornir, rapporteur."

这会查找 M.(句点被转义),然后是任何内容(未转义的 .),次数不确定(*),然后是第二个(转义的)句点(?是为了确保它是不贪婪的,所以它不寻找最后一个周期,只寻找下一个周期)。

它 returns 到那里的所有内容 (\1),并丢弃其余部分。

1) sub 匹配字符串开头(^) 然后捕获M..下一个匹配 spaces 如果有的话,然后捕获下一个点之前的所有内容。最后匹配其他所有内容。将其替换为第一个捕获 (\1)、space 和第二个捕获 (\2)。

请注意,我们使用 sub 而不是 gsub,因为每个组件只有一个整体匹配。此外,它会在 M. 之后放置一个 space,即使它还没有。

sub("^(M\.) *([^.]+\.).*", "\1 \2", v)

给予:

[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

2) read.table 此解决方案不使用任何正则表达式。我们使用点分隔字段读入 v,然后使用 sprintf.

将它们 assemble 组合在一起
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) paste/trimws/sub 这个用了几个函数,只有一个正则表达式,比较简单。我们从第 3 个字符开始获取所有内容,将第一个点及其后的所有内容替换为一个点,trim whitespace 以防留下任何内容并将 M. 粘贴到开头。

paste("M.", trimws(sub("\..*", ".", substring(v, 3))))

给予:

[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

添加

    gsub("^([^.]*.[^.]*).*", "\1.", v)

[1] "M. le président."               "M.Gabriel Xaaperei."           
[3] "M. Raymond Fornir, rapporteur."