Regex R正则表达式在字符串后/前提取数字

Regex R正则表达式在字符串后/前提取数字,regex,r,Regex,R,我试图构造一个正则表达式来标识工作“pack”/“pck”/“packs”/“Set”(不区分大小写)所在的字符串,如果是(word存在),则提取该单词前面或后面的数字。示例: "Fregon EcoClean Multipurpose Scrubber For Pots, Pans, Kitchen, and Bathroom, Green, 3-Pack" -> 3 Bathroom, Green, 3 Pack" -> 3 "Franklin Sports NHL Mini H

我试图构造一个正则表达式来标识工作“pack”/“pck”/“packs”/“Set”(不区分大小写)所在的字符串,如果是(word存在),则提取该单词前面或后面的数字。示例:

"Fregon EcoClean Multipurpose Scrubber For Pots, Pans, Kitchen, and Bathroom, Green, 3-Pack" -> 3
Bathroom, Green, 3 Pack" -> 3
"Franklin Sports NHL Mini Hockey Goal Set of 2" ->2
"Make: Electronics Components Pack 2" -> 2
"Make: Electronics Components Pack of 2 -> 2
我尝试使用以下表达式:

sub(".*pack(\\d+).*", "\\1", "inflow100 pack6 distance12")
然而,它并不符合上述所有情况。
有什么想法吗?

把最后一个号码拿来

sub(".*\\b(\\d+).*", "\\1", str)


以下正则表达式匹配所有示例:

\b(?:(\d+)[-\s][Pp]ack|(?:[Pp]ack|[Ss]et)\s?(?:of\s)?(\d+))

如果您使用它,您会注意到该数字被放在\1或\2中。剩下唯一要做的就是去掉前面或后面的空格

> gsub(".*\\b(?:(\\d+)[-\\s][Pp]ack|(?:[Pp]ack|[Ss]et)\\s?(?:of\\s)?(\\d+)).*", "\\1 \\2", "inflow100 pack6 distance12", perl=TRUE)
[1] " 6"

参见我的最后一个示例。应该返回“of”是的数字,但这是一个问题,因为您之前写的数字在列出的单词之前或之后。如果描述包含数字,则此操作将失败。也许这对Nirke来说已经足够好了,但我们不能确定,对吗?在R中,大多数答案只针对用户示例。。如果op仍然有任何问题,我将编辑我的答案。如果描述中包含@mlambrichs的数字,代码不会失败。请尝试使用“Xerox2100系列3包”。我也同意Avinash的观点,我们可以通过想象不适用于用户所面临的问题的可能性来轻松地进行过度编码。这很公平。但这意味着我们甚至可以放弃\b.如果你想挑剔代码,考虑一下<>代码> 12PACK @ MalBriChs会发生什么。上述代码不会产生所需的输出。但是使用
sub(“.*(\\d+\\d+?).*”、“\\1”、x)
或用户的第二个选项就可以很容易地解决这个问题。
> gsub(".*\\b(?:(\\d+)[-\\s][Pp]ack|(?:[Pp]ack|[Ss]et)\\s?(?:of\\s)?(\\d+)).*", "\\1 \\2", "inflow100 pack6 distance12", perl=TRUE)
[1] " 6"