具有最后一次出现,前瞻和不仅仅是条件的正则表达式

时间:2015-08-12 07:09:36

标签: python regex regex-lookarounds

我需要一个正则表达式,它在字符串中搜索最后一个下划线并匹配if:

  • 根本没有下划线
  • 最后一个下划线后跟" 0.abc"
  • 最后一个下划线后跟" *。abc",其中*不能只由数字组成,必须是非空字符串
  • 在所有情况下,它必须以" .abc"
  • 结尾

有效案例:

dsafjukfa.abc
dfgdsafdsf_0.abc
eatAda-gfda_fdagfda_asf01.abc
eatgdagfda_fdagfda_asf01_0.abc
eatgdagfda_fdagfda_asf01_1a.abc

无效案例:

asdfsadf_546.abc
eatgdagfda_fdagfda_asf01_1.abc
dsafjukfa.xyz
dfgdsafdsf_0.xyz
eatAda-gfda_fdagfda_asf01.xyz
eatgdagfda_fdagfda_asf01_0.xyz
eatgdagfda_fdagfda_asf01_1a.xyz

我基本上需要最后一次出现,正面/负面前瞻和一个非唯一数字字符串

的组合

一切都应该在Pythons正则表达式引擎中运行。

编辑:自提出要求:部分尝试部分看起来像是

"^[^_]*$"
"(?!.*_)(0|\w*).abc"

但是,由于这并没有多大帮助,我只是描述了我期望所需的技术。

1 个答案:

答案 0 :(得分:1)

^[^_]*.abc$|_(?=0\.abc[^_]*$)|_(?=\d*[^\d_][^_]*\.abc[^_]*$)
  1. 根本没有下划线 - ^[^_]*$
  2. 下划线,然后是 0.abc - _(?=0\.abc)
  3. 下划线,然后是 *。abc ,其中 * 是一个可变数量的字符,其中至少有一个是数字 - _(?=\d*\D.*\.abc)
  4. 我们通过确保在直到字符串结尾之后没有下划线来强调最后一个。
  5. See it in action

    <小时/> 实现最后一条规则的更可读的替代方法是使用单独的前瞻:

    ^[^_]*.abc$|(?:_(?=0\.abc)|_(?=\d*\D.*\.abc))(?=[^_]*$)
    

    See it in action