同时测试字符串的存在性和匹配性的正则表达式

0 投票
3 回答
1649 浏览
提问于 2025-04-16 13:59

我想要判断一个字符串 S 中是否有一个子串 MYSUBSTRING,前面有两个连续的数字。我需要确定这两个数字。

举个例子:

'aaa79bbbMYSUBSTRINGccc'

==> 我想要得到 7, 9 和 True(或者 7, 9 和 MYSUBSTRING)

'aaa79bbbccc'

==> 我想要得到 7, 9 和 False(或者 7, 9 和 None)

我能用一个正则表达式来做到这一点吗?如果可以,应该用哪个?

3 个回答

0

当然可以,你可以使用 (\d)(\d).*?(MYSUBSTRING)? 这个表达式。在Python中,你可以在 re.search 函数里这样使用:

s = ... # your string
m = re.search(r'(\d)(\d).*?(MYSUBSTRING)?', s)
m.group(1) # first digit
m.group(2) # second digit
m.group(3) # the substring, or None if it didn't match
0

这是一个有趣的问题。这段复杂的代码:

(\d)(\d)(.(?!(MYSUBSTRING)))*.?(MYSUBSTRING)?

对我来说似乎是有效的。

我们来拆解一下:

(\d)(\d)              # capture 2 digits
(.(?!(MYSUBSTRING)))* # any characters not preceded by MYSUBSTRING
.?                    # the character immediately before MYSUBSTRINg
(MYSUBSTRING)?        # MYSUBSTRING, if it exists
4

下面这个正则表达式应该可以解决你的问题:

(\d)(\d)(?:.*?(MYSUBSTRING))?

>>> re.search(r'(\d)(\d)(?:.*?(MYSUBSTRING))?', 'aaa79bbbMYSUBSTRINGccc').groups()
('7', '9', 'MYSUBSTRING')
>>> re.search(r'(\d)(\d)(?:.*?(MYSUBSTRING))?', 'aaa79bbbccc').groups()
('7', '9', None)

撰写回答