正则表达式中的可选分组选择不起作用。

3
我想从以下文本中提取数字:
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      |
|---------------|---------------|---------------|

将第二组作为下限,第三组作为上限。

我尝试了以下正则表达式:

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

遗憾的是这不符合第二和第三组。只要从两个组的末尾删除?,它就可以适用于第二行。你有什么建议吗?


你确定60必须在第二组而不是第三组吗(因为T>60)? - Casimir et Hippolyte
1个回答

2

尝试:

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

查看正则表达式演示

  1. ^ 匹配字符串开头。
  2. Something_Time 匹配 'Something_Time '
  3. (\d{1,6}) 第一组:1 - 6 位数字
  4. min 匹配 ' min'
  5. (?:.*?[ >](-?\d{1,2}))? 可选组,匹配 0 或多个非换行字符,后跟空格或'>',然后是数字(可选的'-'后跟最多 2 位数字)。数字放在第二组中。
  6. (?:.*?[ =](-?\d{1,2}))? 可选组,匹配 0 或多个非换行字符,后跟空格或'=',然后是数字(可选的'-'后跟最多 2 位数字)。数字放在第三组中。
  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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接