我想使用正则表达式在文件中搜索此表达式:
time:<float> s
我只想得到浮点数。 我正在学习正则表达式,这就是我所做的:
astr = 'lalala time:1.5 s\n'
p = re.compile(r'time:(\d+).*(\d+)')
m = p.search(astr)
好吧,我从time:1.5
获得m.group(0)
我怎样才能直接获得1.5
?
答案 0 :(得分:1)
因为你说你正在学习正则表达式,所以我要包含一些额外的python特定的物质。正如已经提到的,对于这个最简单的正则表达式肯定是\d+\.\d+
在各种命令中,如下所述。
最初让我失去了python的东西是让我了解各种re方法的返回类型以及何时使用group()与groups()。
您可以使用以下几种方法:
match()
将只返回一个对象。
search()
会找到第一个模式和顶部。
findall()
会在字符串中找到所有内容。
如果找不到匹配项,match()和search()的返回类型是匹配对象,__Match [T]或None。但是findall()的返回类型是一个列表[T]。这些不同的回报类型显然会对您从比赛中获得价值的方式产生影响。
匹配和搜索都会公开group()和groups()方法以检索您的匹配项。但是当使用findall时,您需要遍历列表或使用枚举器拉取值。所以使用findall:
>>>import re
>>>easy = re.compile(r'123')
>>>matches = easy.findall(search_me)
>>>for match in matches: print match
123
如果您正在使用search()或match(),则需要使用.group()或groups()来检索匹配,具体取决于您设置正则表达式的方式。
从documentation开始,“groups()方法返回一个元组,其中包含所有子组的字符串,从1到多个子组都有。”
因此,如果你的正则表达式中没有组,如下例所示,你将不会得到任何回报:
>>>import re
>>>search_me = '123abc'
>>>easy = re.compile(r'123')
>>>matches = easy.search(search_me)
>>>print matches.groups()
()
在正则表达式中添加“组”可以使用它:
>>>import re
>>>search_me = '123abc'
>>>easy = re.compile(r'(123)')
>>>matches = easy.search(search_me)
>>>print matches.groups()
('123',)
您不必在正则表达式中指定组。即使表达式中的括号中没有任何内容,group(0)或group()也将返回整个匹配。 --group()默认为group(0)。
>>>import re
>>>search_me = '123abc'
>>>easy = re.compile(r'123')
>>>matches = easy.search(search_me)
>>>print matches.group(0)
123
如果您使用的是括号,则可以使用组来匹配特定的组和子组。
>>>import re
>>>search_me = '123abc'
>>>easy = re.compile(r'((1)(2)(3))')
>>>matches = easy.search(search_me)
>>>print matches.group(1)
>>>print matches.group(2)
>>>print matches.group(3)
>>>print matches.group(4)
123
1
2
3
我还想指出,除非您关注可用性和/或可读性的原因,否则您不必编译正则表达式。它不会改善你的表现。
>>>import re
>>>search_me = '123abc'
>>>#easy = re.compile(r'123')
>>>#matches = easy.search(search_me)
>>>matches = re.search(r'123', search_me)
>>>print matches.group()
希望这有帮助!我发现像debuggex这样的网站在学习正则表达式时很有帮助。 (虽然有时候你必须刷新那些页面;我才知道在重新加载页面之后,我正在敲打我的头几个小时,我的正则表达式工作得很好。)最近我觉得通过抛出沙盒代码你也得到了很好的服务像wakari.io,或像PyCharm等IDE,并观察输出。 http://www.rexegg.com/也是一般正则表达式知识的好网站。
答案 1 :(得分:0)
我认为你真正想要的正则表达式更像是:
re.compile(r'time:(\d+\.\d+)')
甚至:
re.compile(r'time:(\d+(?:\.\d+)?)') # This one will capture integers too.
请注意,我将整个时间分为1个分组。我还逃脱了.
这意味着正则表达式中的任何角色。
然后,您从1.5
获得m.group(1)
- m.group(0)
是整个匹配。 m.group(1)
是第一个子匹配(带括号的分组),m.group(2)
是第二个分组等。
示例:
>>> import re
>>> p = re.compile(r'time:(\d+(?:\.\d+)?)')
>>> p.search('time:34')
<_sre.SRE_Match object at 0x10fa77d50>
>>> p.search('time:34').group(1)
'34'
>>> p.search('time:34.55').group(1)
'34.55'
答案 2 :(得分:0)
您可以为此创建另一个组。我还会稍微更改正则表达式以允许没有小数分隔符的数字。
re.compile(r'time:((\d+)(\.?(\d+))?')
现在您可以使用group(1)
来捕获浮点数的匹配。