正则表达式匹配一个或多个组太多

时间:2016-11-22 15:41:55

标签: python regex

我有一系列不同复杂程度的文件名。基本上,它们总是被[_] {ASSET} _ [OPTIONAL_DESCRIPTION] _v {#####}。{EXT}拆分。 ([] s是可选的,在这种情况下)。但是在这种格式中,每一件都可以是任意复杂的。 (领先_s是任意的)

character_thing_v001.md
character_Description_v001.md
character_Some_Long_Description_v001.md
character_thing_with_additional_info_v001.md
character_thing_with_additional_info_Description_v001.md
character_thing_with_additional_info_More_Description_Info_v001.md
character_with_additional_info_Complete234ly_arbitrary_Description_v001.md
_character_thing_v001.md
___character_Description_v001.md
____character_Some_Long_Description_v001.md
__character_thing_with_additional_info_v001.md
__character_thing_with_additional_info_Description_v001.md
___character_thing_with_additional_info_More_Description_Info_v001.md

我做了一个前瞻性断言,将ASSET和DESCRIPTION分开,一切正常,直到最近,当我的老板在系统中投入扳手。现在我必须支持其惯例可能是" some_undercase"或" CAPS _ ###"。我修改为允许A-Z并使descriptionText匹配任何东西。这就是乱七八糟的地方。

     (?:[_]+)?
     (?P<assetText>[a-zA-Z0-9]+
       (?=_[a-zA-Z0-9]+)?  # lookahead and optionally assert _Capital
         (?:(?:_[a-zA-Z0-9]+)+)?  # match next group if it exists
     )  # get full match
     (?:[_]+)?
     \_(?P<descriptionText>.+)?
     \_v(?P<versionIncrement>\d+)
     \.(?:\.)?
       (?P<extension>(?:md|some|other|extension|options)) 

这让我成为了那里的一部分,但它有你可以查看的问题,here

既然ASSET可以有大写字母,那么前瞻与ASSET匹配太多,并开始进入描述。这种模式是自动生成的几种模式之一,因此我正在寻找解决问题根源的方法,而不是围绕它编写。任何指导都会非常感谢,谢谢。

1 个答案:

答案 0 :(得分:1)

我无法真正遵循你的正则表达式的某些部分的逻辑似乎是不必要的。

this simplified regex做同样的工作吗?

_*
(?P<assetText>[a-zA-Z0-9]+(_[a-z_0-9]+)?)
(_  (?P<descriptionText>[a-zA-Z0-9_]+)  )?
_v(?P<versionIncrement>[0-9]+)
(?P<extension>\.[A-Za-z0-9]+)

可能需要澄清构成资产的内容的(自然语言)规则以及构成可选描述的内容:

  • “资产”是否可以包含下划线(我假设没有,从第一句中的模板开始)?
    • 如果是:“资产”结束和“描述”开始的规则是什么?描述总是以大写字母开头吗?
      • 如果是:大写字母可以和不能与“资产”一起出现的规则是什么?如果没有限制,那么资产和描述之间的分割确实是不明确的。