1 回答
TA贡献1824条经验 获得超8个赞
这是通过 Pythonre
库使用正则表达式对您所要求的内容进行粗略的近似。
import re m = re.match(r'(?:\{[^-#{}/]+\})?(?:([^-#{}/]+)-)?([^-#{}/]+)(?:/[^-#{}/]+)?(?:#([^-#{}/]+))?', word) if m: prefix, root, suffix = m.groups()
您的示例似乎也有=
和|
作为分隔符,但是一旦您了解了它是如何工作的,扩展它以允许这些分隔符应该相对简单。
简而言之,如果正则表达式不匹配,则re.match()
返回False
,否则返回一个匹配对象,该对象的.groups()
方法包含与正则表达式中分组括号匹配的文本。(?:...)
括号是非分组的,括号中没有?:
紧跟在左括号后面的捕获成组。
表达式可以分为以下几种:
(?:\{[^-#{}/]+\})?
- 非分组表达式可跳过其中的任何内容{braces}
(?:([^-#{}/]+)-)?
- 破折号之前任何内容的分组表达式的非分组包装器-
([^-#{}/]+)
- 主根 - 分组表达式以捕获与分隔符之一不匹配的文本(?:/[^-#{}/]+)?
- 非分组表达式忽略斜杠后的任何内容(?:#([^-#{}/]+))?
- 与破折号类似,捕获 后的任何后缀#
,用非分组包装器围绕整个组,然后对分隔符后的文本进行分组捕获
乍一看这似乎令人生畏,但是一旦您破译了第一对,您就应该了解它们是如何工作的。让我们更详细地检查一下破折号表达式。
(?:
- 我们需要一个非捕获组将所有这些标记为可选,放在最后(
- 将分组括号之间的任何匹配文本捕获到.group()
[^-#{}/]
- 匹配不是-
or#
or{
or or}
or的单个字符/
+
- 实际上,前面的一个或多个,尽可能多)
- 捕获结束-
- 只要所有这些都以破折号结尾-
)?
- 所有这些都是可选的;如果跳过此步骤将允许整体表达式匹配,则正则表达式引擎会(但如果可能的话,它仍然会更喜欢匹配 - 这称为“贪婪匹配”)。
请注意如何[^-#{}/]+
不断出现在所有这些组中。我们不想让我们捕获的文本与分隔符之一匹配。
您没有指定如何处理空格,因此这只是将它们视为任何其他字符。也许您也想在它们与分隔符相邻时将它们排除在组之外?
添加回答
举报