首页 > 解决方案 > 正则表达式可选组选择不起作用

问题描述

我想从以下文本中提取数字:

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 组不匹配。一旦?从两个组的末尾删除,它就适用于第二行。你有什么建议吗?

标签: regex

解决方案


尝试:

^Something_Time (\d{1,6}) min(?:.*?[ >](-?\d{1,2}))?(?:.*?[ =](-?\d{1,2}))?.*$

见正则表达式演示

  1. ^匹配字符串的开头。
  2. Something_Time 匹配“Something_Time”
  3. (\d{1,6})第 1 组:1 - 6 位数
  4. min匹配“分钟”
  5. (?:.*?[ >](-?\d{1,2}))?匹配 0 个或多个非换行符后跟空格或“>”后跟数字(可选“-”后跟最多 2 位数字)的可选组。该号码位于第 2 组。
  6. (?:.*?[ =](-?\d{1,2}))?匹配 0 个或多个非换行符后跟空格或“=”后跟数字(可选“-”后跟最多 2 位数字)的可选组。该号码位于第 3 组。
  7. .*匹配 0 个或多个非换行符。
  8. $匹配字符串的结尾或字符串结尾之前的换行符。

在 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')

推荐阅读