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的单个字符/+- 实际上,前面的一个或多个,尽可能多)- 捕获结束-- 只要所有这些都以破折号结尾-)?- 所有这些都是可选的;如果跳过此步骤将允许整体表达式匹配,则正则表达式引擎会(但如果可能的话,它仍然会更喜欢匹配 - 这称为“贪婪匹配”)。
请注意如何[^-#{}/]+不断出现在所有这些组中。我们不想让我们捕获的文本与分隔符之一匹配。
您没有指定如何处理空格,因此这只是将它们视为任何其他字符。也许您也想在它们与分隔符相邻时将它们排除在组之外?
添加回答
举报
