我有一些像下面这样的代码。它在文件的每一行中搜索一些模式,如果找到,从匹配的模式中提取一些字符串。每条线最多只能匹配一个模式(如果有的话)。文件中有什么只是文本行,有些行有hight = 123,一些介质= 123,以及一些低= 123。python:更好的方法来提取匹配的模式?
with open(file) as r:
for line in r:
if re.search('high=\d+', line):
p = re.search('high=(\d+)', line)
high = p.group(1)
elif re.search('medium=\d+', line):
p = re.search('medium=(\d+)', line)
medium = p.group(1)
elif re.search('low=\d+', line):
p = re.search('low=(\d+)', line)
low = p.group(1)
...
现在我不知道是否我可以没有做的第二搜索中提取匹配的部分,与一些无效码作为一个例子如下所示。搜索到的模式可能彼此完全不同。这里的问题是在re.search()返回true之后是否有方法来提取匹配的部分。
with open(file) as r:
for line in r:
if re.search('high=(\d+)', line):
high = _.group(1) # invalid code, but looking for something like this.
elif re.search('medium=(\d+)', line):
medium = _.group(1) # invalid code
elif re.search('low=(\d+)', line):
low = _.group(1) # invalid code
...
注意我可以做到以下,但那不是我想要的。
with open(file) as r:
for line in r:
m = re.search('high=(\d+)', line)
if m:
high = m.group(1)
else:
m = re.search('medium=(\d+)', line)
if m:
medium = m.group(1)
else:
m = re.search('low=(\d+)', line)
if m:
low = m.group(1)
...
我曾试图先编译模式,如下面的,但我得到了错误“NameError:名字‘_’没有定义”。我用python2和python3试了这个。 _.group(1)有一些特殊的表现(在某些情况下它有效)。我可能会在单独的帖子中提出这个问题。
h = re.compile('hight=(\d+)')
m = re.compile('medium=(\d+)')
l = re.compile('low=(\d+)')
with open(file) as r:
for line in r:
if h.search(line):
high = _.group(1)
elif m.search(line):
medium = _.group(1)
elif l.search(line):
low = _.group(1)
...
如果您可以给出一个输入示例以及您期望从中产生的内容,这将有所帮助。 – naktinis
@naktinis谢谢。我添加了一些解释。其实这个问题很简单。在re.search()返回true之后,是否有办法获得匹配模式的部分内容,无论它是什么? Perl可以让你做到这一点(匹配的部分保存在全局变量中)。 – Shiping
Python没有自动分配给全局变量。你可以很容易地编写一个包装函数来实现它,但它并不是内置于语言中的。 –