基于一串数字:
(30123:424302) 123 #4324:#34123
我怎样才能只得到前面没有“#”的数字?我已经找到了如何得到前面有“#”(\#+\d+)的数字,但我需要相反的方法。我可以将所有\d+分组,然后基于我的模式进行反向匹配吗?为了澄清,在上面的例子中我需要30123、424302和123。
\#+\d+
\d+
30123
424302
123
jqjz2hbq1#
你可以尝试使用负lookbehind +单词边界的正则表达式:
(?<!#)\b\d+
RegEx Demo
RegEx详情:
(?<!#)
#
\b
rjjhvcjd2#
你需要
(?<![#\d])\d+
参见regex demo。
图案详情
(?<![#\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+)获取了正确的值。
#\d+
(\d+)
2条答案
按热度按时间jqjz2hbq1#
你可以尝试使用负lookbehind +单词边界的正则表达式:
RegEx Demo
RegEx详情:
(?<!#)
:当#
出现在前面的位置时,匹配失败的负向后查找条件\b
字边界\d+
:匹配1+位rjjhvcjd2#
你需要
参见regex demo。
图案详情
(?<![#\d])
-一个负向后查找,如果当前位置之前有一个数字或#
字符,则匹配失败\d+
-一个或多个数字。参见Python demo:
如果你需要以你最初想到的方式“反转”某些东西,你可以匹配你不想要的东西,然后匹配并捕获你想要的东西,在收集匹配后,从结果列表中删除所有空值:
参见this Python demo。
正如您所看到的,
#\d+
消耗了#
之后的所有数字(即在不希望的上下文中),而(\d+)
获取了正确的值。