我正在尝试根据 File Naming Rules 解析 Ebuild 文件格式.
到目前为止,我想出了:
(?P<name>[a-z0-9_-]+)-(?P<major>[0-9]+)(\.(?P<minor>[0-9]+))?(\.(?P<micro>[0-9]+))?(?P<release>(_alpha|_beta))*(?P<status>(_pre|_rc\d+|_p\d+))(?P<revision>-r\d+)*
它没有完成这项工作 ( Regex examples )。
我很不高兴,我的版本表达式在组匹配中包含 . 并且 release 在匹配中包含字符 _。此外,修订版 会查找“-r”字符而不是返回其自身的数字。
如何修复我的正则表达式?
请您参考如下方法:
您可以将分隔符放在命名组之前,而不是使用分隔符量化命名组模式,用可选的非捕获组包裹分隔符和命名组,并使用 ? 量词匹配 1或出现 0 次而不是 *(您不希望重复 release、alpha 等)。
所以模式可以是
pattern = r'''(?x) # Free spacing (re.X/re.VERBOSE) mode on
^ # Start of string
(?P<name>[a-z0-9_-]+) # Name group: 1+ lowercase ASCII letters, digits, _ and -
- # a - char
(?P<major>[0-9]+) # Major group: 1+ digits
(?:\.(?P<minor>[0-9]+))? # . and Minor group: 1+ digits
(?:\.(?P<micro>[0-9]+))? # . and Micro group: 1+ digits
(?:_(?P<release>alpha|beta))? # _ and Release group: "alpha" or "beta"
(?:_(?P<status>pre|(?:rc|p)[0-9]+))? # _ and Status group: "pre" or "rc" / "p" followed with 1+ digits
(?:-r(?P<revision>[0-9]+))? # -r, Revision group: 1+ digits
$ # End of string
'''
参见 regex demo
