R-如何使用GSUB和正则表达式删除文本向量的部分



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

我相信,如果与正则表达式相关,则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",尽管没有遵循"。我的直觉是,在GSUB中,正则表达式似乎有所不同 - " M"。在我的代码中,R可以用r读为" m |"。另外, ^在外观之后,似乎并不能用作锚点,而只是作为附加标点字符。

所需的结果如下:

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

任何帮助。

1(sub 匹配字符串(^(的开头,然后捕获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 此解决方案不使用任何正则表达式。我们使用DOT分离字段在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(粘贴/trimws/sub 这使用了几个功能,只有一个正等式,这相对简单。我们将所有内容从第三个字符开始,用圆点替换第一个点和所有内容,以防万一,如果有的剩下的。

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

给予:

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

add

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

您将正则表达式放在方括号中,该方括号将其解释为一个组,然后确实将该组中的所有内容都视为"或"。您还使用 ^将R视为"不是"之前,因此它基本上是在您的搜索词中寻找任何其他内容。此外,您没有逃脱自己的时期。这是应有的正则:

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

这是M.(逃脱的时期(,其次是任何东西(未消除的(。在不确定的次数(*(中,随后是第二个(逃脱(时期(?是为了确保它是不避免的,因此,它不在最后一个时期,只有下一个时期(。

它们将所有内容都返回到那里(\1(,然后丢弃其余的。

最新更新