当没有1,2,3或4组的实例介于两者之间时,如何匹配(group2。* | ^。*)group1?

时间:2015-06-13 21:35:33

标签: regex regex-negation regex-lookarounds

我正在使用Python 3.4。

假设我们有四个由正则表达式组成的组

g1 = 'g11|g22|...|g1m'
g2 = 'g21|g22|...|g2n'
g3 = 'g32|g32|...|g3p'
g4 = 'g41|g42|...|g4q'

例如,g1可能是'chickens|horses|bonnet(?>!blue )'。这些组是不相交的:四个组中任何一个组中的任何元素都不属于多个组。这些组可以包含任意数量的大于1的元素。

我希望匹配字符串,当且仅当包含任何 group_1实例时,才能:

  1. 任何组1-4的任何实例都不在所述 group_1或
  2. 的实例之前
  3. 紧接在所述 group_1实例之前的1-4组中的任何实例不是group_2。
  4. 我想要匹配的一些字符串:

    1. 'g11'
    2. 'g31 g11'
    3. 'g41g11'
    4. 'g11 g21 g11'(g11的第二个实例违反了规则2. g11的第一个实例没有,而且规则1也满足。)
    5. 'anything or nothing g11 anything or nothing'
    6. 'anything or nothing g31 anything or nothing g11'
    7. 我不想匹配的一些字符串:

      1. 'g31 g21 g11'
      2. 'g21 g11 g31'
      3. 'anything or nothing g21 anything or nothing g11 anything or nothing'
      4. 迄今为止尝试了什么:

        • 我尝试过:(g31|g32)(?=.*?(g11|g12))(?!.*?(g21|g22)),适用于 'g31 g11''g31 g21 g11',但如果在g11之后存在g21或g22,则会失败,如'g31 g11 g21'中所示。

        • 我还尝试了'(g31|g32).*?(g21|g22){0}.*?(g11|g22)' 'g31 g11''g31 g21 g11'但不适用'g31 g31 g21 g11'

1 个答案:

答案 0 :(得分:1)

^(?!(?:(?!g1|g2).)*(?:g21|g22)(?:(?!g31|g32|g41|g42).)*(?:g11|g12)).*?(?:g11|g12).*$

你可以尝试一下。参见演示。

https://regex101.com/r/hI0qP0/16