Python将字符串与几个正则表达式进行比较
我对Perl和Ruby很有经验,但对Python还不熟悉,所以我希望有人能告诉我用Python的方法来完成以下任务。我想将几行代码与多个正则表达式进行比较,并检索匹配的组。在Ruby中是这样的: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
# 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):等等…这很好,但我正在寻找更一般的东西,简单的正则表达式只是为了解释,实际的正则表达式会相当复杂。