正则表达式:特殊字符之间的数字(但不包括所有数字)

3

我想解决一个相对简单的解析问题,正则表达式似乎非常适合。我仍在努力理解符号表示法,所以我希望能得到一些关于我要做的事情的指导。我手头的字符串格式如下:

x = 'Testing - 12:34: I dont want this number at the end 4567:'

根据我的理解:

test = re.findall(r'\b(\d+)\b',x)

将会输出

['12', '34', '4567']

很接近,但还不够完美。问题在于我不会在最后扫描每个字符串,因此我希望有一个正则表达式语句而不仅仅是


test = test[:2]

基本上,我想要表达的条件是“提取-和第二个:之间的数字,但不包括这两个符号。”(例如,形式为['12','34']中的12:34)。这是否可能?谢谢! http://regexstorm.net/tester?p=%3b%5cd%2b%3d%5cd%2b%5c%3f&i=0014%3b5010730101000033347%3d4510120173%3fAA

为什么你不想要最后一个数字? - cs95
这更像是在我解析数据的某些行中发生的一次性事件,但会造成巨大的混乱。也许调整正则表达式并不是正确的答案,我应该只是消除所有字符串的最后几个元素以完全避免这个问题? - user6142489
我的问题更多是想知道这句话的意思:“问题在于不是每个我要扫描的字符串都在结尾,因此我想有一个正则表达式语句。” - cs95
我明白了。我的意思只是并非每个字符串都会出现在末尾有数字的问题(这就是为什么我写的简单正则表达式不起作用的原因)...只是想通过正则表达式来解决它的动机。 - user6142489
@user6142489 像这个这样的吗? - Gurmanjot Singh
哇,那是一个很棒的网站 - 我要去试试看 - 谢谢! - user6142489
1个回答

2
这可能会更容易一些,只需使用两个表达式:
import re

x = 'Testing - 12:34: I dont want this number at the end 4567:'

rx_outer = re.compile(r'-((?:[^:]*:){2})')
rx_inner = re.compile(r'\d+')

numbers = [number.group(0) 
            for match in rx_outer.finditer(x) 
            for number in rx_inner.finditer(match.group(0))]

print(numbers)
# ['12', '34']

"外部"正则表达式定义了第一个破折号和第二个冒号之间的切片,而"内部"正则表达式扫描数字。该逻辑包含在列表理解中。

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