正则表达式:如何将.*限制为仅数字和标点符号

3

我正在尝试创建语句,其中可以使用带有条件的.*(例如不连续两个字母),但是我一直失败了。从这里开始:

"SOMETEXT 1-7, 39-41, 12B, 1-7, SOME OTHER TEXT, SOME MORE OTHER TEXT"

我想找到:

"SOMETEXT 1-7, 39-41, 12B, 1-7,"

我已经达到了可以查找跟随数字和任何逗号的文本的程度:

^[A-Z]+[A-Z] [1-9].*,

在这里使用正则表达式构建器: https://regex101.com/r/yK6oF4/1 但是在这里我仍然得到:
"SOMETEXT 1-7, 39-41, 12B, 1-7, SOME OTHER TEXT,"

我该如何让 .* 停止查找连续两个字母、逗号、空格和字母等任意条件?我只想查找在 .* 之前的数字(包括 "数字" 如 12B)和标点符号。
我使用 R,但我认为这个问题一般与正则表达式有关。

3
尝试这个:^[A-Z]+[A-Z] .*[1-9], - anubhava
1
正则表达式问题应该始终标记上适当的语言,因为不同的语言/库实现正则表达式的方式是不同的。 - Wiktor Stribiżew
@anubhava 谢谢!在这种情况下它确实有效,但我仍然接受了下面的答案,因为它更通用(例如,如果由于某些数据原因,在数字和逗号之间有一个空格,它仍然有效)。 - Jakob
1个回答

1

您可以使用

^[A-Z]+[A-Z] [1-9].*?(?=,\s*[A-Z]{2})

请查看正则表达式示例。您可以使用它作为stringr::str_extract(x, "^[A-Z]+[A-Z] [1-9].*?(?=,\\s*[A-Z]{2})")

细节

  • ^ - 字符串的开头
  • [A-Z]+[A-Z] - 两个或多个大写字母(= [A-Z]{2,})
  • [1-9] - 从19的数字
  • .*? - 任意零个或多个字符(不包括换行符),尽可能少
  • (?=,\s*[A-Z]{2}) - 正向先行断言要求在当前位置的右侧有一个逗号、零个或多个空格,然后是两个大写ASCII字母。

base R中,您也可以使用以下内容:

sub("^([A-Z]+[A-Z] [1-9].*?),\\s*[A-Z]{2}.*", "\\1", x, perl=TRUE)

请参见this regex demo


1
太棒了,感谢您提供的详细信息,这对我很有帮助! - Jakob
只是为了完整性,没有办法反过来,而是寻找这两个字母的方法,限制 .* 只查找数字和标点符号,对吗? - Jakob
1
@Jakob 将 .* 替换为 [\p{N}\p{P}\p{S}]*[[:punct:][:digit:]]* - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接