我需要使用文本语料库中的正则表达式读取所有形式的数字,货币,带单位的数字等。 我写了以下正则表达式来捕获所有场景:
((\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', '')]
这意味着正则表达式正在正确捕获所有条件。 但是我需要的输出是完全匹配,即上面返回的元组的第一个匹配。我不希望输出中有任何组匹配。如何确保?
我尝试使用锚点和和?:查找,但是不起作用。请帮忙。
答案 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中查看它如何与某些示例输入匹配。