Regex(Python):匹配前面没有字符的整数

jmp7cifd  于 2023-04-22  发布在  Python
关注(0)|答案(2)|浏览(74)

基于一串数字:

(30123:424302) 123 #4324:#34123

我怎样才能只得到前面没有“#”的数字?我已经找到了如何得到前面有“#”(\#+\d+)的数字,但我需要相反的方法。我可以将所有\d+分组,然后基于我的模式进行反向匹配吗?
为了澄清,在上面的例子中我需要30123424302123

jqjz2hbq

jqjz2hbq1#

你可以尝试使用负lookbehind +单词边界的正则表达式:

(?<!#)\b\d+

RegEx Demo

RegEx详情:

  • (?<!#):当#出现在前面的位置时,匹配失败的负向后查找条件
  • \b字边界
  • \d+:匹配1+位
rjjhvcjd

rjjhvcjd2#

你需要

(?<![#\d])\d+

参见regex demo

图案详情

  • (?<![#\d])-一个负向后查找,如果当前位置之前有一个数字或#字符,则匹配失败
  • \d+-一个或多个数字。

参见Python demo

import re
text = "(30123:424302) 123 #4324:#34123"
print(re.findall(r"(?<![#\d])\d+", text))
# => ['30123', '424302', '123']

如果你需要以你最初想到的方式“反转”某些东西,你可以匹配你不想要的东西,然后匹配并捕获你想要的东西,在收集匹配后,从结果列表中删除所有空值:

import re
text = "(30123:424302) 123 #4324:#34123"
print(list(filter(None, re.findall(r"#\d+|(\d+)", text))))

参见this Python demo
正如您所看到的,#\d+消耗了#之后的所有数字(即在不希望的上下文中),而(\d+)获取了正确的值。

相关问题