我有一个列表,其中每个元素包含文本数据的向量。从本质上讲,我希望代码删除正则表达式之后的文本:第二个"。在各自的矢量中。
我相信,如果与正则表达式相关,则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
(,然后丢弃其余的。