首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gsub和正则表达式删除文本向量的部分

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

Stack Overflow用户
提问于 2019-06-28 18:36:17
回答 3查看 117关注 0票数 1

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

如果将gsub函数用于正则表达式,我相信它是一个很好的方法。我尝试使用正则表达式来构造要检测的模式(见下文)。

数据:

代码语言:javascript
复制
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)

代码返回以下内容:

代码语言:javascript
复制
[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=”。此外,“查找之后”似乎不是作为锚点,而只是作为附加的标点符号。

预期结果如下:

代码语言:javascript
复制
[1] "M. le président."
[2] "M. Gabriel Xaaperei."
[3] "M. Raymond Fornir, rapporteur."

任何帮助都很感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-28 18:48:32

1)子匹配字符串(^)的开头,然后捕获M。下一个匹配空间(如果有的话),然后捕捉到下一个点之前的所有内容。最后匹配所有其他的东西。将其替换为第一个捕获(\1)、一个空格和第二个捕获(\2)。

注意,我们使用的是sub而不是gsub,因为每个组件只有一个整体匹配。而且,它在M之后放了一个空格,即使它还没有。

代码语言:javascript
复制
sub("^(M\\.) *([^.]+\\.).*", "\\1 \\2", v)

给予:

代码语言:javascript
复制
[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

2) read.table此解决方案不使用任何正则表达式。我们使用点分隔字段在v中读取,然后使用sprintf将它们组装回一起。

代码语言:javascript
复制
with(read.table(text = v, sep = ".", fill = TRUE, strip.white = TRUE), 
  sprintf("%s. %s.", V1, V2))

给予:

代码语言:javascript
复制
[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

3)粘贴/剪裁/子--它使用几个函数,只使用一个正则表达式,这相对简单。我们从第三个字符开始,将第一个点及其后面的所有内容替换为一个点,修剪空格以防留下任何点,并将M粘贴到开头。

代码语言:javascript
复制
paste("M.", trimws(sub("\\..*", ".", substring(v, 3))))

给予:

代码语言:javascript
复制
[1] "M. le président."               "M. Gabriel Xaaperei."          
[3] "M. Raymond Fornir, rapporteur."

添加

票数 3
EN

Stack Overflow用户

发布于 2019-06-28 18:50:28

代码语言:javascript
复制
    gsub("^([^.]*.[^.]*).*", "\\1.", v)

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

Stack Overflow用户

发布于 2019-06-28 18:46:23

您将正则表达式放在方括号中,R将其解释为一个组,然后将该组中的所有内容都视为"OR“。在此之前还有^,这使得R将其视为"NOT",因此它基本上只查找搜索词中的字符。而且,你没有摆脱你的月经。这是它应该是的正则表达式:

代码语言:javascript
复制
gsub("^(M\\..*?\\.).*","\\1",v)
[1] "M. le président."               "M.Gabriel Xaaperei."           
[3] "M. Raymond Fornir, rapporteur."

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

它返回到那里的所有东西(\\1),并丢弃其余的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56811778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档