python - 正则表达式 - 如何捕获之前没有不同模式的模式?
问题描述
我试图解析价格,但忽略了两种价格模式。其中一个例外是总价,我使用前瞻来忽略最后的总价。第二个排除是如果Q
价格之前的字母有变化,例如,Q10.00
或者Q AWSMSN11.32
但我想包括如果有一个三个字母的 alpha 恰好Q
以YMQ234.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
预期产出
+---------------------------------------------------------------------------+---------+---------+
| 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 |
+---------------------------------------------------------------------------+---------+---------+
解决方案
你也可以匹配你不想要的,捕捉你想要的。
匹配有 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
例如
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']
推荐阅读
- haskell - Hspec deal with two IO actions in Haskell
- android-gradle-plugin - ionic3: build.gradle 文件
- angular - 管道完成后如何获取值?
- php - PHP:如果用户存在,则 PDO 检查不起作用
- netbeans - 使用 Netbeans 将 Mercurial 提交到 sourceforge
- tensorflow - 分布式 TensorFlow 在 CreateSession 期间挂起
- f# - 如何在 F# 中编写 csv?
- python - “ModuleNotFoundError:没有名为 x 的模块”:Pydev 配置正确吗?
- javascript - 检查数字列表的 if 语句
- html - 如何将文件内容显示为 HTML 以使其成为完整的 HTML