如何从返回的组匹配列表中仅读取正则表达式标识的完全匹配

时间:2019-09-13 04:24:38

标签: python regex

我需要使用文本语料库中的正则表达式读取所有形式的数字,货币,带单位的数字等。 我写了以下正则表达式来捕获所有场景:

((\d+([.,/:()-]\d+)*)([A-Za-z]*[0-9]*[/]*)*)

我正在测试的字符串是:

"250 11:45 The world 11:23:45 123.45.78 123.45 123,67 567,89,89 789,90,90.09 -140 -140.67 2/4 9.8m/sec2 586.99hd/s/d"

我得到的输出是:

[('250', '250', '', ''), ('11:45', '11:45', ':45', ''), ('11:23:45', '11:23:45', ':45', ''), ('123.45.78', '123.45.78', '.78', ''), ('123.45', '123.45', '.45', ''), ('123,67', '123,67', ',67', ''), ('567,89,89', '567,89,89', ',89', ''), ('789,90,90.09', '789,90,90.09', '.09', ''), ('140', '140', '', ''), ('140.67', '140.67', '.67', ''), ('2/4', '2/4', '/4', ''), ('9.8m/sec2', '9.8', '.8', ''), ('586.99hd/s/d', '586.99', '.99', '')]

这意味着正则表达式正在正确捕获所有条件。 但是我需要的输出是完全匹配,即上面返回的元组的第一个匹配。我不希望输出中有任何组匹配。如何确保?

我尝试使用锚点和和?:查找,但是不起作用。请帮忙。

2 个答案:

答案 0 :(得分:1)

由于在整个正则表达式周围都有一个捕获组,因此每个元组的第一个元素是整个匹配项。因此,只需提取所有这些内容即可。

[el[0] for el in result]

其中result是您的原始输出。

但是您可以通过将?:放在每个组的开头来更改正则表达式以使用非捕获组。

(?:\d+(?:[.,/:()-]\d+)*)(?:[A-Za-z]*[0-9]*[/]*)*

答案 1 :(得分:0)

我猜测也许这个简单的表达式可能行得通:

\d\S+

测试

import re

expression = r"\d\S+"

string = """
250 11:45 The world 11:23:45 123.45.78 123.45 123,67 567,89,89 789,90,90.09 -140 -140.67 2/4 9.8m/sec2 586.99hd/s/d
"""

print(re.findall(expression, string))

输出

['250', '11:45', '11:23:45', '123.45.78', '123.45', '123,67', '567,89,89', '789,90,90.09', '140', '140.67', '2/4', '9.8m/sec2', '586.99hd/s/d']

如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。