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

Python将字符串与几个正则表达式进行比较,python,regex,switch-statement,Python,Regex,Switch Statement,我对Perl和Ruby很有经验,但对Python还不熟悉,所以我希望有人能告诉我用Python的方法来完成以下任务。我想将几行代码与多个正则表达式进行比较,并检索匹配的组。在Ruby中是这样的: # 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

我对Perl和Ruby很有经验,但对Python还不熟悉,所以我希望有人能告诉我用Python的方法来完成以下任务。我想将几行代码与多个正则表达式进行比较,并检索匹配的组。在Ruby中是这样的:

# 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中的尝试结果非常糟糕,因为匹配组是从对正则表达式的match/search调用返回的,Python在条件语句或switch语句中没有赋值。关于这个问题,蟒蛇式的解决方法(或思考方法)是什么?

类似的,但更漂亮:

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

for regex in regexes:
  m = regex.match(s)
  if m:
    print m.groups()
    break
else:
  print 'No match'
在Python中有几种“动态绑定名称”的方法,例如我的旧方法用于“分配和测试”;在本例中,我可能会选择另一种类似的方式(假设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
当然,许多小细节都可以调整(例如,我只是选择了
(.*)
而不是
(.*)
作为匹配组——考虑到紧跟其后的
$
,它们是等价的,所以我选择了较短的形式;-)——您可以预编译REs,以不同于
pats\u mark
元组的方式进行分解(例如,通过重新模式索引dict)等


但是,我认为,实质性的想法是使结构数据驱动,并用子表达式<代码>将匹配对象绑定到一个名称,用于Mo中的[R.Mat.p,Line ] < /C>,在单个项列表上的“循环”(GEnEXPS只通过循环绑定名称,而不是通过赋值)——一些人认为使用GEXEXPS规范的这一部分是“棘手的”。但是我认为它是一个完全可接受的Python熟语,尤其是因为它被认为是在ListCops的时候,GEXEPS的“祖先”在某种意义上被设计了。

< P>你的正则表达式简单地取了第三个字符之后的任何东西。

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"

使用中间类
REMatcher
执行匹配,存储匹配组,并返回一个用于成功/失败的布尔值,最终生成了最清晰的代码。

我尝试了类似的方法,但我想根据regex匹配的内容采取不同的操作,因此我从列表移动到了字典mappi如果找到匹配项,则调用lambdas的正则表达式,但这会导致一些混乱的代码…请参阅。是的,这个问题正是我想要的-谢谢!很好的方法,但我会使用拆分和比较:begin,rest=line。如果begin==a,则拆分(':',1):等等…这很好,但我正在寻找更一般的东西,简单的正则表达式只是为了解释,实际的正则表达式会相当复杂。