【问题标题】:regexpr and only matching prices and not other digitsregexpr 并且只匹配价格而不是其他数字
【发布时间】:2013-02-18 03:18:00
【问题描述】:

我正在尝试编写仅从一行文本中提取价格的代码。

RegEx for Prices?的启发,我想出了以下命令:

gregexpr('\\d+(\\.\\d{1,2})', '23434 34.232 asdf 3.12  ')

[[1]]
[1]  7 19
attr(,"match.length")
[1] 5 4
attr(,"useBytes")
[1] TRUE

但是,就我而言,我只希望 3.12 匹配而不是 34.232。有什么建议吗?

【问题讨论】:

  • 如果你想提取值,那么使用sub比使用gregexpr更好/直接。

标签: regex r


【解决方案1】:

我认为这应该可行:

'\\d+\\.\\d{1,2}(?!\\d)'

【讨论】:

  • 谢谢,与perl = T 参数一起使用时对我有用。以上也适用于gregexpr
【解决方案2】:
\\d+\\.\\d{1,2}(?!\\d)

我不能 100% 确定 r 支持负前瞻,所以这里有一个替代方案:

\\d+\\.\\d{1,2}(?:[^\\d]|$)

【讨论】:

  • 如果您使用 perl=TRUE 参数,则 R 支持负前瞻等内容。
  • 如果您想捕获它,您不需要将\\d+\\.\\d{1,2} 括在括号中吗?
  • @Michael 如果是整场比赛,则不会。
  • 嗨,我刚刚尝试了替代方案,它匹配 34.232,而不是 3.12
  • @andrewj Michael 关于捕获是正确的,因为最后一个数字也将被整个比赛捕获
【解决方案3】:

一个或多个数字后跟一个点,后跟 1 或 2 位数字,后跟空格或字符串结尾

\\d+\\.\\d{1,2}(\w|$)

编辑:根据 cmets,R 使用双转义

【讨论】:

  • 行不通。你没有逃脱那个时期。您还要么在价格结束后捕获单词,要么假设价格在字符串的末尾,这两者都是 OP 可能不想要的。 .
  • 对,你是关于逃避期间的。不小心将其取消转义...将整个内容括在括号中并将其作为更大语句的一部分将允许 Marius 仅选择匹配的标记
  • 注意r 标签。这就是为什么所有其他答案都有双重转义: \\ .
  • @Matthew 这是在 R 中标记正则表达式的困难。正则表达式在某种程度上是它自己的事情,那些不熟悉 R 的人认为正则表达式是正则表达式。出于这个原因,我经常对在 R 中使用正则表达式标签(在 SO 上)犹豫不决。
  • 注意,感谢您提醒我要更加注意标签描述:)
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多