繁体   English   中英

用 Python 函数中的正则表达式搜索的结果替换列表中的变量

[英]Replacing a variable in a list with the result of a regex search in a Python function

我有三个列表lst_alst_c 我想编写一个函数,从列表中获取每个项目,根据 lst_b 执行正则表达式搜索,根据lst_b搜索组位置, lst_a lst_c的变量。

这是我的代码:

import re

var_1 = var_2 = var_3 = "replace_me"

lst_a = [
var_1,
var_2,
var_3,
]

lst_b = [
'(foo)(bar)',
'(foo)(bar)(baz)',
'(foo)(baz)(bar)',
]

lst_c = [1, 2, 3]

def lst_search_n_save(variables, regex, position):
    global lst_a
    global lst_b
    for r in regex:
        try:
            variables = re.search(r, "foobarbaz")
            #variables := re.search(r, "foobarbaz") -> not working
            print(variables)
            print(rf"{variables.group(position)}")
        except (AttributeError, TypeError, IndexError):
            print("error" + "\n")
            variables = "not found"

lst_search_n_save(lst_a, lst_b, lst_c[2])

print(lst_a)

搜索和查找工作,但我无法获得将其结果保存到lst_a变量中的函数。 这就是我得到的:

<re.Match object; span=(0, 6), match='foobar'>
error

<re.Match object; span=(0, 9), match='foobarbaz'>
baz
None
error

['replace_me', 'replace_me', 'replace_me']

在我的示例中使用的位置参数的预期输出应该是:

print(lst_a)
['not found', 'baz', 'bar']

print(lst_a[1])
baz

首先,预期结果不一致。 这意味着第三个正则表达式“(foo)(baz)(bar)”会在“foobarbaz”中找到匹配项,这是不正确的。 所以第三个结果也应该是“找不到”。

然后对您的尝试发表一些评论:

  • 随着参数成为局部变量,您不能期望函数仅通过分配给局部变量variables来更改全局list_a list_a不会因运行此函数而改变。

  • 为了克服第一个问题,让函数返回包含三个结果的列表并且为此传递参数会更合适。

  • 由于要生成列表,因此不应将结果分配给variables ,而是将结果附加到它,因此构建要返回的列表

  • 避免global语句。 这里不需要它们。

  • 避免在函数中使用硬编码值,例如“foobarbaz”。 而是将其作为参数传递给函数,因此它变得更加灵活。

  • 不是问题,但是尽管您的问题陈述提到了list_c ,但您的代码只使用该列表中的一个值。 所以它不需要是一个列表。 但我会保持这部分不变。

  • 我会避免调用变量variables ,这表明这个变量包含变量......这没有什么意义。 我们称之为results

这是一个更正:

import re

def lst_search_n_save(regex, position, s):
    results = []
    for r in regex:
        try:
            match = re.search(r, s)
            result = match.group(position)
        except (AttributeError, TypeError, IndexError):
            result = "not found"
        results.append(result)
    return results

# Example given in question:
lst_b = ['(foo)(bar)', '(foo)(bar)(baz)', '(foo)(baz)(bar)']
lst_c = [1, 2, 3]
lst_a = lst_search_n_save(lst_b, lst_c[2], "foobarbaz")

print(lst_a)  # ['not found', 'baz', 'not found']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM