我需要创建一个正则表达式来匹配可选组之前的所有内容,但是我需要可选组优先于 . 元字符。
只要该组不是可选的,一切都会按我的预期进行:
>>> re.match(r'(.+)(\d+)','asdasd2').groups()
('asdasd', '2')
但是,将其标记为可选时,结果不再符合我的需求:
>>> re.match(r'(.+)(\d+)?','asdasd2').groups()
('asdasd2', None)
在 . 上使用非贪婪修饰符 ? 会使情况变得更糟:
>>> re.match(r'(.+?)(\d+)?','asdasd2').groups()
('a', None)
这是我在实际代码中使用的更复杂的正则表达式的抽象,其中可选组本身非常复杂,因此使用 [^somecharacter] 而不是 。 不是一个选项。这个问题有什么解决办法吗?
请您参考如下方法:
我认为这可能是您正在寻找的,假设您总是希望从搜索中返回两个组:
>>> re.match(r'(.+(?=\d+)|.+)(\d+)?', 'asdasd2').groups()
('asdasd', '2')
>>> re.match(r'(.+(?=\d+)|.+)(\d+)?', 'asdasd').groups()
('asdasd', None)
第一组 (.+(?=\d+)|.+) 寻找一组字符后跟一个数字(但不包括数字)或只是一组字符(隐含地后面没有数字,因为这种情况会被 (.+(?=\d+) 捕获)。第二组 (\d+)? 看起来对于一组数字出现 0 次或 1 次。
