我设置了一个小功能来在一行上运行一个可配置的正则表达式列表,到目前为止我有两个正则表达式,但它似乎只执行了一个与正则表达式相关的模式,这里'我的代码。
def run_all_regex(self, line):
regexp: {
'regex1' : 'complicated regex',
'regex2' : 'complicated regex2',
}
for key, pattern in regexp.iteritems():
m = match(pattern, line)
if m:
x = line
else:
x = None
return x
我在for,key ...之后添加了一个print语句,以查看正在打印的图案,而这只是第二个!删除第二个后,第一个打印出来!是什么给了什么?
编辑:
所以我已经看到我的回复陈述使我的功能陷入困境,我想详细说明我在这里尝试做什么。
基本上我打开一个文件,逐行读取,并且对于运行此函数的每一行,将运行该行的两个(到目前为止)正则表达式,如果该行与正则表达式匹配,则将其返回到键在一个字典中。这是代码。
for key in dict:
with open(key) as f:
for line in f:
dict[key] = self.run_all_regex(line)
所以在最后,dict [key]应该是一行,与run_all_regex部分中的正则表达式相匹配。
答案 0 :(得分:3)
return x
在第一次迭代后结束你的for循环。
答案 1 :(得分:1)
def run_all_regex(self, line):
regexp = {
'regex1' : 'complicated regex',
'regex2' : 'complicated regex2',
}
results = {}
for key, pattern in regexp.iteritems():
m = match(pattern, line)
if m:
results[key] = line
else:
results[key] = None
return results
这将返回一个字典,每个正则表达式的结果都存储为值,而键是正则表达式字典中的键。
答案 2 :(得分:0)
我不确定你想要达到什么目标,但是如果能够详细说明并解释更多你期望的内容,你可以编写更好的代码吗?
import re
def run_all_regex(line):
regexp= {'regex1' : 'complicated regex','regex2' : 'complicated regex2'}
for key, pattern in regexp.iteritems():
m = re.match(pattern, line)
if m:
x = line
else:
x = None
return x
print run_all_regex('complicated regex')
如果您想使用列表理解,而不是每次都返回:
res= [re.match(pattern, line) for x in regexp.iteritems()]
您可以根据需要考虑使用“Any Operator或other operator:
res= Any(re.match(pattern, line) for x in regexp.iteritems())
我建议还检查re.match以了解正则表达式是什么(如果您正在测试此算法以学习正则表达式,以及如何在两个项目之间进行匹配)。
第二个答案基于您编辑过的问题 让我们以这个快速而小的例子来阐明在匹配项目中使用正则表达式
让我们举一个例子,看看我们是否可以验证两个单词是否以" a"开头。
Pattern ::(a \ w +)\ W(a \ w +)
l= ["animal alfa", "do don't"]
for element in l:
# Match if two words starting with letter d.
m = re.match("(a\w+)\W(a\w+)", element)
# See if success.
if m:
print(m.groups())
预期产出:('动物',' alfa')
2-让我们概括一下检查不同正则表达式的想法
# Split text to store every line in the list.
text= """
dog dot\n say said \n bolo bala \n no match
"""
l= "\n".split(text)
#Output
#l = ["dog dot", "say said", "bolo bala", "no match"]
# Try to make some RE patterns for test
regex1 : verify if two words starts with d
regex2 : verify if two words starts with s
regex3 : verify if two words starts with b
regexp= {'regex1' : "(d\w+)\W(d\w+)",'regex2' : "(s\w+)\W(s\w+)",'regex3' : "(b\w+)\W(b\w+)"}
# Loop in list of items
for element in l:
# Match if two words starting with letter d. It produces a list of booleans (True if there is match, False if not, indexed based on the order of regexp)
m = [re.match(reg, element) for re in regexp.iteritems()]
# if v is true (the result of re.match(reg, element)), we store the index, and group using tuple
listReg= [ (i,v.groups()) for i,v in enumerate(m) if v]
我希望它能帮助您了解如何解决您的问题(不确定我是否理解所有问题)。