【问题标题】:",(?!.*\\))" returning "Invalid Regex" error in R",(?!.*\\))" 在 R 中返回 "Invalid Regex" 错误
【发布时间】:2015-07-20 01:12:39
【问题描述】:

我有一个正在使用的字符串,我试图只选择括号外的逗号,以便我可以根据它拆分字符串。这是我正在使用的字符串:

“LIVINGSTON(布莱顿、迪尔菲尔德、热那亚、哈特兰、奥西奥拉和蒂龙镇)、麦克姆、梦露、奥克兰、萨尼拉克、圣克莱尔和韦恩县”

我正在尝试使用问题标题中提到的正则表达式,它告诉我它无效。大概这是因为应该被转义的右括号被 R 识别为关闭匹配组的括号,所以第二个括号把所有东西都扔掉了。我只是好奇如何解决这个问题。这是我正在使用的语法:

counties <- "LIVINGSTON (Townships of Brighton, Deerfield, Genoa, Hartland,, Oceola & Tyrone), MACOMB, MONROE, OAKLAND, SANILAC, ST. CLAIR, AND WAYNE COUNTIES"
tmp <- strsplit(counties, ',(?!.*\\))')

我显然可以做与我现在正在做的相反的事情,而不是在括号外的逗号上拆分文本,只需替换括号内的逗号,然后在逗号上拆分字符串,但我'想知道为什么这不起作用。

【问题讨论】:

  • 原来只是设置perl=T 解决了这个问题。
  • substr() 不接受 perl= 参数,所以我在下面添加的解决方案我仍然认为是必要的。
  • @ForrestR.Stevens 我认为 substr 是操作员的错字,因为运行问题中的代码不会给出无效的正则表达式错误
  • @rawr 感谢您指出这一点,是的,这是一个错字。很抱歉造成混乱!我已编辑问题以反映正确的问题。

标签: regex r string escaping


【解决方案1】:

我认为您的正则表达式不起作用的原因是因为它非常 Perl-ish,这需要 perl=T 标志。我认为它也有点畸形,因为您应该检查左括号和右括号是否完整......我认为这是一个通用的解决方案,而不仅仅是您的具体情况:

counties <- "LIVINGSTON (Townships of Brighton, Deerfield, Genoa, Hartland,, Oceola & Tyrone), MACOMB, MONROE, OAKLAND, SANILAC, ST. CLAIR, AND WAYNE COUNTIES"
tmp <- strsplit(counties, ",(?![^(]*\\))", perl=T)

【讨论】:

  • 这个解决方案有效,所以我接受了它作为答案。但是对于将来可能会发现此问题的任何人,我想指出此解决方案中的正则表达式和原始问题中的正则表达式提供相同的结果。似乎添加 perl=T 是将其从无效正则表达式更改为“R-compliant”正则表达式的唯一方法。
  • 感谢@brittenb,请注意,perl=T 参数实际上只是告诉 R 将正则表达式解析为类似 Perl 的正则表达式。从这个意义上说,它不是 R 独有的,也不是“符合 R 的”。 R 有两种正则表达式引擎,POSIX 和 Perl,它们在许多方面相似,但允许不同的字符类表示。
  • 我不知道这两个变体的引擎,所以这是很好的信息;我只是指出更改正则表达式以包含开头括号并没有改变结果。我的目标是强化 R 需要将其解释为 Perl 正则表达式才能工作的想法。再次感谢您的意见和解决方案。
【解决方案2】:

因为你有一个不平衡的)

https://regex101.com/r/jE0lI9/1

应该是:

counties <- "LIVINGSTON (Townships of Brighton, Deerfield, Genoa, Hartland,, Oceola & Tyrone), MACOMB, MONROE, OAKLAND, SANILAC, ST. CLAIR, AND WAYNE COUNTIES"
tmp <- substr(counties, ',(?!.*\\)')

【讨论】:

  • 我承认我在问题中有一个不平衡的“)”。第二个“)”应该关闭匹配组,而第一个“)”应该是正则表达式的一部分。
  • 虽然你对 perl 部分的看法是正确的,但这仍然是无效的 r 代码并且不起作用
【解决方案3】:

如果我正确理解了这个问题,试试这个:

strsplit(gsub("\\(.*\\)", "", counties), ",")[[1]]

【讨论】:

  • 如果没有一个警告,该解决方案将起作用:我需要将括号中的文本包含在第一个县中。否则这正是我所需要的。
猜你喜欢
  • 2019-08-20
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2015-12-18
  • 2022-07-28
相关资源
最近更新 更多