python - 正则表达式 - 如何在一组中捕获两种模式?
问题描述
我想将两种不同的模式捕获到一个捕获/匹配组中。这甚至可能吗?
第一种模式:由空格包围的两个字符字母数字([A-Z0-9]{2})
第二种模式:两个字符的字母数字前面是字母数字和一个十进制值后面跟一个空格\b[A-Z ]*\d+\.\d{2}([A-Z0-9]{2})
这两种模式一起捕获了我想要的一切,但问题是我需要它们在单个捕获组中并按照捕获的顺序(参见预期输出)。
测试字符串
ABC WS PIT342.55USD342.55END
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
YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END
预期产出
+------------------------------------------------------------------------------+------------------------+
| ABC WS PIT342.55USD342.55END | WS |
| ABC WS YMQ234.03WS TOY234.03USD468.06END | WS, WS |
| FUR BB LAB Q10.00 199.00USD209.00END | BB |
| YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END | DG, LD |
| PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END | VP, EE |
| YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END | DL, MO, DF, ET, DL, DL |
+------------------------------------------------------------------------------+------------------------+
解决方案
例如,您可以从字符类中省略空格,因为它与本部分[A-Z ]*
中的第一个不匹配。WS
WS YMQ234.03WS
由于这两种模式在以 2 个字母数字和空格结尾时具有相同的部分,因此您可以使用交替 |
来匹配前面的空格或第二个模式的第一部分。
(?:\b[A-Z]*\d+\.\d{2}| )([A-Z0-9]{2})
解释
(?:
轮换的非捕获组|
\b[A-Z]*\d+\.\d{2}
字边界,匹配 0+ 次字符 AZ、1+ 位、点和 2 位|
或
)
关闭非捕获组([A-Z0-9]{2})
捕获组 1,匹配 2 次字母数字
示例代码
import re
strings = [
"ABC WS PIT342.55USD342.55END",
"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",
"YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END"
]
for s in strings:
print(re.findall(r"(?:\b[A-Z]*\d+\.\d{2}| )([A-Z0-9]{2}) ", s))
输出
['WS']
['WS', 'WS']
['BB']
['DG', 'LD']
['VP', 'EE']
['DL', 'MO', 'DF', 'ET', 'DL', 'DL']
推荐阅读
- reactjs - gh-pages 脚本无法将 .nojekyll 提交到 GitHub
- vue.js - 如何在(子)组件上使用 Axios 调用 API 并将结果呈现在 Nuxt 中的 Page(父)组件上?
- shell - 如何将太大的 .txt 文件合并到一个文件中?
- postgresql - Docker 与 micronaut 组成试图连接到本地主机中的 postgres
- javascript - 如何在我的侧面导航中使用 CSS 和 Javascript 添加从左到右的平滑滑动效果?
- javascript - 选择带有 react-native-testing-library 的标签的正确方法是什么?
- .net-core - NPoco 耗尽 .NET Core 3.1 上的连接池
- javascript - 如何将 Bing 地图插入到 traccar 嵌入 html 页面中?
- python-3.x - 如何从标准化顶点裁剪正方形图像
- python - 沿轮廓线标记拐点