使用|对于python re

时间:2017-09-23 04:21:15

标签: python regex

我有标签ID ABxxx,其中x是任意数字。在此标记中,AB之前可以有空格,之后(AB)之间可以有无限空格,或者有AB_。见下面的列表。

  1. (AB)_xxx
  2. (AB)_xxx
  3. AB_xxx
  4. (AB) xxx
  5. ABxxx
  6. 我想为每个标签获取元组对。我创建了一个表达式来获取它们。

    tag=re.compile(r'\s*\(*(AB)\)*\s*\_ (\d{2,3})\s*$',re.VERBOSE).match('AB_678').groups()
    print(tag)
    

    结果为('AB', '678')

    但现在我想排除以下格式:

    1. (AB_xxx
    2. AB xxx
    3. 我通过包含非捕获组语法和OR运算符来调整re语句。

      tag=re.compile(r'^\s*(?:(AB | \(AB\)\s* | AB\_ | \(AB\)\_)) (\d{2,3})\s*$',re.VERBOSE).match('(AB)_678').groups()
      print(tag)
      

      尝试(AB_xxx后,它给了我错误,我想要的。除非我尝试了可接受的条件,否则它将在我的元组中包含()或_。  例如:'(AB)_678'会产生('(AB)_', '678')

      我理解我正在使用?:来表示整个AB或语句,这就是为什么它会拉出额外的非特殊字符。

      我尝试围绕每个条件放置()但现在它为每个条件提供了额外的元组元素:(None, None, 'AB', None, '678')

      tag=re.compile(r'^\s*(?:(AB) | \((AB)\)\s* | (AB)\_ | \((AB)\)\_) (\d{2,3})\s*$',re.VERBOSE).match('AB_678').groups()
      print(tag) 
      

      不太确定去哪里。到目前为止我有正确的方法吗?

1 个答案:

答案 0 :(得分:1)

所以下面的正则表达式对我有用

^(AB|(?:\((?:AB)\)))(?:_|\s{2,})?(\d{2,3})

将其分解为三个部分

<强> ^(AB |(?:((?: AB))))

在开始时匹配AB(AB)

<强>(?:_ | \ S {2,})吗

寻找_或最少2个空格或

(适用\ d {2,3})

获取两位或三位数

regex101.com上进行测试,以确保它仅匹配有效案例而非无效案例

RegExTest

唯一的问题是,您的论坛将是AB(AB)。使它始终捕获AB会使正则表达式复杂,这可以通过你的python代码轻松处理