Python与几个正则表达式比较字符串

问题描述:

我对Perl和Ruby非常有经验,但是对Python来说是新手,所以我希望有人能够告诉我Pythonic方式来完成以下任务。我想比较几行与多个正则表达式并检索匹配的组。在Ruby中它会是这样的:Python与几个正则表达式比较字符串

# Revised to show variance in regex and related action. 
data, foo, bar = [], nil, nil 
input_lines.each do |line| 
    if line =~ /Foo(\d+)/ 
    foo = $1.to_i 
    elsif line =~ /Bar=(.*)$/ 
    bar = $1 
    elsif bar 
    data.push(line.to_f) 
    end 
end 

我在Python的尝试都转向了相当难看,因为匹配组从调用返回匹配一个正则表达式/搜索和Python在条件语句不转让或切换语句。对于这个问题,Pythonic怎么做(或想想)?

+1

请参阅http://stackoverflow.com/questions/2554185/match-groups-in-python。 – PaulMcG 2010-04-13 23:30:47

+0

是的,那个问题是我在找的 - 谢谢! – maerics 2010-04-13 23:53:06

使用中间类REMatcher它执行匹配,存储该匹配组,并返回成功的布尔的Paul McGuire's solution /失败原来以产生用于该目的的最清晰的代码。

这样的事情,但是更漂亮:

regexs = [re.compile('...'), ...] 

for regex in regexes: 
    m = regex.match(s) 
    if m: 
    print m.groups() 
    break 
else: 
    print 'No match' 
+1

我尝试了类似的东西,但我想根据哪个正则表达式匹配采取不同的操作,所以我从一个列表移动到一个字典,将正则表达式映射到lambdas,以便在找到匹配的情况下调用lambdas,但它会产生一些令人困惑的代码。 – maerics 2010-04-13 23:00:47

有几种方法来“绑定在运行一个名为”在Python,如我的老recipe的“分配和测试”;在这种情况下,我可能会选择另一种这样的方式(假设的Python 2.6,需要如果你正在使用旧版本的Python工作的一些细微变化),是这样的:

import re 
pats_marks = (r'^A:(.*)$', 'FOO'), (r'^B:(.*)$', 'BAR') 
for line in lines: 
    mo, m = next(((mo, m) for p, m in pats_mark for mo in [re.match(p, line)] if mo), 
       (None, None)) 
    if mo: print '%s: %s' % (m, mo.group(1)) 
    else: print 'NO MATCH: %s' % line 

许多微小的细节可以调节,当然(例如,我只是选择了(.*)而不是(.*?)作为匹配组 - 它们与立即跟随的$相同,因此我选择了较短的形式;-) - 您可以预编译RE,将事情分解成不同的比pats_mark元组(例如,具有由RE模式索引的字典)等等。

但我认为,实质性的想法是让st并且将匹配对象与动态名称绑定在一起,子表达式为for mo in [re.match(p, line)],单个项目列表中的“循环”(genexps仅通过循环绑定名称,而不是通过赋值来绑定名称 - 有些人考虑使用此部分genexps的规格是“棘手”,但我认为它是一个完全可以接受的Python成语,尤其是。因为,当时正在设计listcomps,genexps的“祖先”)。

你的正则表达式只需要第三个字符之后的任何东西。

for line in open("file"): 
    if line.startswith("A:"): 
     print "FOO #{"+line[2:]+"}" 
    elif line.startswith("B:"): 
     print "BAR #{"+line[2:]+"}" 
    else: 
     print "No match" 
+0

不错的方式,但我会使用拆分和比较: 开始,休息= line.split(':',1) 如果开始==“A”:等等...... – moshez 2010-04-13 23:33:29

+0

这是好的,但我是寻找更一般的东西,简单的正则表达式只是为了解释的目的,实际的正则表达式会相当复杂。 – maerics 2010-04-13 23:52:17