3

我想要做的就是在一个字符串中搜索两个连续数字的实例。如果找到这样的实例,我想对它进行分组,否则为该特定组返回 none。我认为这将是微不足道的,但我不明白我要去哪里错了。在下面的示例中,删除可选 (?) 字符会得到数字,但在没有数字的字符串中,r计算结果为 None,因此 r.groups() 会引发异常。

p = re.compile(r'(\d{2})?')
r = p.search('wqddsel78ffgr')
print r.groups()
>>>(None, )    # why not ('78', )?

# --- update/clarification --- #

感谢您的回答,但给出的解释让我一无所知。这是另一个准确指出我不明白的地方的方法。

pattern = re.compile(r'z.*(A)?')
_string = "aazaa90aabcdefA"
result = pattern.search(_string)
result.group()
>>> zaa90aabcdefA
result.groups()
>>> (None, )

我明白为什么result.group()会产生结果,但为什么不result.groups()产生('A', )?我认为它是这样工作的:一旦正则表达式命中z它,然后使用.*. 尽管.*匹配所有内容,正则表达式引擎知道它传递了一个可选组,并且由于?意味着它会尝试匹配,如果可以,它应该向后工作以尝试匹配。替换?+确实返回('A', )。这表明?如果没有必要,它不会尝试匹配,但这似乎与我读过的关于该主题的大部分内容(尤其是 J. Friedl 的优秀书籍)形成鲜明对比。

4

5 回答 5

1

这对我有用:

p = re.compile('\D*(\d{2})?')
r = p.search('wqddsel78ffgr')
print r.groups()  # ('78',)

r = p.search('wqddselffgr')
print r.groups()  # (None,)
于 2012-11-07T13:30:00.897 回答
0

使您的?正则表达式匹配空字符串。如果你省略它,你可以像这样检查结果:

p = re.compile(r'(\d{2})')
r = p.search('wqddsel78ffgr')
print r.groups() if r else ('',)
于 2012-11-07T13:26:21.980 回答
0

请记住,您可以使用以下命令轻松搜索字符串中 RE 的所有匹配项findall()

re.findall(r'\d{2}', 'wqddsel78ffgr') # => ['78']

如果您不需要匹配发生的位置,这似乎是一种更简单的方法来完成您正在做的事情。

于 2012-11-07T13:55:33.700 回答
0

使用正则表达式模式

(\d{2}|(?!.*\d{2}))

(见这个演示

如果您想确保恰好有 2 个连续数字而不是 3 个或更多,请使用

((?<!\d)\d{2}(?!\d)|(?!.*(?<!\d)\d{2}(?!\d)))

(见这个演示

于 2012-11-07T13:15:24.370 回答
-1

? - 是 0 或 1 次重复。所以正则表达式处理器首先尝试找到 0 个重复,然后......找到它:)

于 2012-11-07T13:27:01.093 回答