Skip to main content
 首页 » 编程设计

python之首选附加的可选正则表达式组而不是点元字符

2024年08月28日38zengkefu

我需要创建一个正则表达式来匹配可选组之前的所有内容,但是我需要可选组优先于 . 元字符。

只要该组不是可选的,一切都会按我的预期进行:

>>> 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 次。