regex - 正则表达式可选组选择不起作用
问题描述
我想从以下文本中提取数字:
Something_Time 10 min (Time in Class T>60�C Something Something )
Something_Time 899 min (Time in Class 35�C<T<=40�C Something Something )
Something_Time 0 min (Time in Class T<=-25�C Something Something )
所以我需要的是:
|---------------|---------------|---------------|
| Group 1 | Group 2 | Group 3 |
|---------------|---------------|---------------|
| 10 | 60 | |
|---------------|---------------|---------------|
| 899 | 35 | 40 |
|---------------|---------------|---------------|
| 0 | | -25 |
|---------------|---------------|---------------|
第 2 组作为下限,第 3 组作为上限。
我尝试了以下正则表达式:
^.* (\d{1,6}) min .*(?:[ \>](\-?\d{1,2}))?.*(?:[\=](\-?\d{1,2}))?.*$
不幸的是,这与第 2 组和第 3 组不匹配。一旦?
从两个组的末尾删除,它就适用于第二行。你有什么建议吗?
解决方案
尝试:
^Something_Time (\d{1,6}) min(?:.*?[ >](-?\d{1,2}))?(?:.*?[ =](-?\d{1,2}))?.*$
^
匹配字符串的开头。Something_Time
匹配“Something_Time”(\d{1,6})
第 1 组:1 - 6 位数min
匹配“分钟”(?:.*?[ >](-?\d{1,2}))?
匹配 0 个或多个非换行符后跟空格或“>”后跟数字(可选“-”后跟最多 2 位数字)的可选组。该号码位于第 2 组。(?:.*?[ =](-?\d{1,2}))?
匹配 0 个或多个非换行符后跟空格或“=”后跟数字(可选“-”后跟最多 2 位数字)的可选组。该号码位于第 3 组。.*
匹配 0 个或多个非换行符。$
匹配字符串的结尾或字符串结尾之前的换行符。
在 Python 中:
import re
tests = [
'Something_Time 10 min (Time in Class T>60�C Something Something )',
'Something_Time 899 min (Time in Class 35�C<T<=40�C Something Something )',
'Something_Time 0 min (Time in Class T<=-25�C Something Something )'
]
for test in tests:
m = re.match(r'^Something_Time (\d{1,6}) min(?:.*?[ >](-?\d{1,2}))?(?:.*?[ =](-?\d{1,2}))?.*$', test)
if m:
print(m.groups())
印刷:
('10', '60', None)
('899', '35', '40')
('0', None, '-25')
推荐阅读
- plugins - 使用模块参数“内容”调用复制模块的正确方法
- php - 在 Laravel Blade 中查找两个日期之间的天数
- django-rest-framework - Django Rest Framework 中的批量请求:作为序列化程序的“实例”参数传递什么?
- html - 基于模型接收复选框的不可更改状态
- gulp - 为什么 gulp.watch 没有触发?
- php - save() 上缺少扩展的拉丁字符 - Laravel 5.8
- python - 多对多通过 Queryset Django 2.2
- r - 在r中的两个“-”之间提取字符串
- css - Chromium 不更新转换原点
- reactjs - 反应通过开关元素向下传递道具