Python正则表达式搜索

时间:2014-01-21 02:20:13

标签: python regex

我想使用正则表达式在文件中搜索此表达式:

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

3 个答案:

答案 0 :(得分:1)

因为你说你正在学习正则表达式,所以我要包含一些额外的python特定的物质。正如已经提到的,对于这个最简单的正则表达式肯定是\d+\.\d+在各种命令中,如下所述。

最初让我失去了python的东西是让我了解各种re方法的返回类型以及何时使用group()与groups()。

您可以使用以下几种方法:

  • re.match()
  • re.search()
  • re.findall()
如果在字符串的开头找到模式,

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)来捕获浮点数的匹配。