【问题标题】:How to replace substring and all non-space contiguous characters with regex?如何用正则表达式替换子字符串和所有非空格连续字符?
【发布时间】:2018-02-06 03:17:40
【问题描述】:

我有一个包含一些格式错误的数据的字符串。

"007>009 021>089,017,018,12 - ,1200EST -"

子字符串,1200EST 是一个错误,可能是属于另一个变量的数据。目前尚不清楚这种类型的格式错误在数据集中的频率有多高,但由于子字符串的格式包含字母(字符串根本不应该有),我想将它作为我的搜索模式 @ 987654323@。关键是要获取子字符串的其余部分,即前面(或潜在的尾随)数字和逗号,如果包含字母,则基本上是空格之间的所有内容。问题是正则表达式模式必须相当通用,基本上是任何字母系列和与字母系列连续的所有非空格字符。

我有这个:

gsub("\\s+.*[[:alpha:]].*\\s+", " ", h2)

这根本不起作用,返回:

[1] "007>009-"  

如何格式化正则表达式模式?

编辑

包含字母的子字符串也可能如下所示:

“EST1200” “ 美东时间 ” “ -1500ABC”

同样,仅由空格分隔的子字符串,包含 1 个或多个字母与 0 个或多个其他任何类型的字符连续。

【问题讨论】:

  • 确定将字符串拆分为单个空格,然后使用grepl 测试任何带有[[:alpha:]] 的子字符串和相应的子集。
  • 您能否举出 4-5 个您认为可能代表您正在寻找的内容的示例?以及您期望的结果?

标签: r regex string gsub


【解决方案1】:

如果你只是想丢失",1200EST",你可以使用这个:

s <- "007>009 021>089,017,018,12 - ,1200EST -"
gsub(",\\d+EST", "", s)

也丢失了尾随" -"

gsub(",\\d+EST -", "", s)

对于领先的"- ",像这样:

gsub(" - ,\\d+EST -", "", s)

等等。

如果您认为这些字母可能不是"EST", 你可以像这样抓住字母:

gsub(" - ,\\d+[A-Z]+ -", "", s)

【讨论】:

  • 这肯定会接近,谢谢。但它不会概括得很正确。
【解决方案2】:

尝试搜索模式(.*),.* 并替换为第一个捕获组。

input <- "007>009 021>089,017,018,12 - ,1200EST -"
gsub("(.*),.*", "\\1", input)

[1] "007>009 021>089,017,018,12 - "

Demo

【讨论】:

  • @Tim_Biegeleisen,感谢提供演示站点。您建议的模式实际上搜索的是什么?我希望我能更流利地使用正则表达式,但是当我读到它时:在逗号之前捕获任意数量的任意字符,在逗号之后会有任意数量的任意字符,但忽略这些。
  • @ConnerM。最初的 .*greedy,并且会吃掉所有东西,直到 last 逗号。
  • 也许正则表达式不是要走的路,不确定。并且不确定我是否足够好地解释了这种情况。即使逗号在那里也不能保证。只能确定此格式错误:包含一些字母的字符串,带有(或不带)任何类型的前导或尾随字符,由空格分隔。
  • 您需要给我们提供更换规则。如果您甚至不能这样做,那么就无法编写正则表达式。实际上,没有你可以做的任何事情
  • @Tim_Biegeleisen,你是对的。同样,对正则表达式不是很流利。帮帮我,这是对正则表达式规则的描述:用单个空格“”替换任何由单个空格分隔的子字符串,其中包含与 0 个或多个其他任何类型的字符连续的一些字母?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多