首页 > 解决方案 > 正则表达式 - 如何捕获之前没有不同模式的模式?

问题描述

我试图解析价格,但忽略了两种价格模式。其中一个例外是总价,我使用前瞻来忽略最后的总价。第二个排除是如果Q价格之前的字母有变化,例如,Q10.00或者Q AWSMSN11.32但我想包括如果有一个三个字母的 alpha 恰好QYMQ234.03.

我在后面添加了一个负面的lookbehind,但似乎无法得到我想要的。

这是我尝试过的模式:(?<![Q\d]) ?M?(\d+\.\d{2})(?=.*\d+\.\d{2}END)

测试字符串

ABC WS YMQ234.03WS TOY234.03USD468.06END
FUR BB LAB Q10.00 199.00USD209.00END
YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END
PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END

正则表达式101

预期产出

+---------------------------------------------------------------------------+---------+---------+
| ABC WS YMQ234.03WS TOY234.03USD468.06END                                  | 234.03  | 234.03  |
| FUR BB LAB Q10.00 199.00USD209.00END                                      | 199.00  |         |
| YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END | 2503.08 | 2503.08 |
| PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END                 | 342.41  | 282.24  |
+---------------------------------------------------------------------------+---------+---------+

标签: pythonregex

解决方案


你也可以匹配你不想要的,捕捉你想要的。

匹配有 a 的可选空格和大写字符,Q并匹配后面的十进制值。

排除消除此匹配断言它前面没有 2 倍大写 AZ 后跟Q

交替后,捕获第 1 组的十进制值,断言后面没有END

\b[A-Z ]*Q[A-Z ]*(?<![A-Z][A-Z]Q)\d+\.\d+|(\d+\.\d{2})(?!END)

解释

  • \b[A-Z ]*Q[A-Z ]*单词边界,匹配Q可选空格和大写字符之间的 a
  • (?<![A-Z][A-Z]Q)负向后看,断言不是 2 个大写字符 AZ,后跟Q直接向左
  • \d+\.\d+匹配十进制值
  • |或者
  • (捕获组 1
    • \d+\.\d{2}匹配 1+ 个数字,后跟一个点和 2 个数字
  • )关闭组 1
  • (?!END)负前瞻,断言直接向右的不是END

正则表达式演示| Python 演示

例如

import re

regex = r"\b[A-Z ]*Q[A-Z ]*(?<![A-Z][A-Z]Q)\d+\.\d+|(\d+\.\d{2})(?!END)"
strings = [
    "ABC WS YMQ234.03WS TOY234.03USD468.06END",
    "FUR BB LAB Q10.00 199.00USD209.00END",
    "YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END",
    "PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END"
]

for str in strings:
    print('{}: {}'.format(str, [x.group(1) for x in re.finditer(regex, str) if x.group(1)]))

输出

ABC WS YMQ234.03WS TOY234.03USD468.06END: ['234.03', '234.03']
FUR BB LAB Q10.00 199.00USD209.00END: ['199.00']
YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END: ['2503.08', '2503.08']
PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END: ['342.41', '282.24']

推荐阅读