在python中按行分组正则表达式匹配项

2024-09-30 18:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从一个(编码糟糕的)python文件中提取结果,我正在查看的示例如下:

 if (name == "wheat"):
    return "WHEAT"
if (name == "enchanted bread") or (name == "ebread") or (name == "bread"):
    return "ENCHANTED_BREAD"
if (name == "hay bale") or (name == "haybale"):
    return "HAY_BLOCK"
if (name == "enchanted hay bale") or (name == "ebale") or (name == "ehayblock"):
    return "ENCHANTED_HAY_BLOCK"
if (name == "tightly-tied hay bale") or (name == "tightly tied hay bale"):
    return "TIGHTLY_TIED_HAY_BALE"

我希望使用此信息制作一个.json并行数组,并按照以下格式“ENCHANTED_BREAD”对其进行索引:[“ENCHANTED BREAD”、“ebread”、“BREAD”]

我试图创建一个正则表达式来查找返回值的所有别名。 到目前为止,我考虑使用以下正则表达式,因为我已经提取了返回值并将它们组织为键:

=="(.*?)"

但它的问题是,我无法将值“分组”以将多个值分配给单个键。由于与同一个键对应的值位于同一行上,因此这可能是正确的方法

我可以在regex中使用什么来对每行的regex匹配进行分组

谢谢你的帮助


Tags: ornamereturnifblockbreadhaytied
2条回答

或者,您可以使用or(|)运算符交错来自name捕获和return捕获的结果。为了让正则表达式捕获返回值的别名和返回字符串本身,您可以使用[^"]+将任何不是"的字符分组一次或多次

import re

data = '''
 if (name == "wheat"):
    return "WHEAT"
if (name == "enchanted bread") or (name == "ebread") or (name == "bread"):
    return "ENCHANTED_BREAD"
if (name == "hay bale") or (name == "haybale"):
    return "HAY_BLOCK"
if (name == "enchanted hay bale") or (name == "ebale") or (name == "ehayblock"):
    return "ENCHANTED_HAY_BLOCK"
if (name == "tightly-tied hay bale") or (name == "tightly tied hay bale"):
    return "TIGHTLY_TIED_HAY_BALE"
'''

regex = r'\(name == "(?P<opts>[^"]+)"|return\s+"(?P<catg>[^"]+)"'
r_iter = re.finditer(regex, data)

tmp_opts = []
result = {}
for m in r_iter:
    if m.group('catg'):
        result[m.group('catg')] = tmp_opts
        tmp_opts = []
    else:
        tmp_opts.append(m.group('opts'))

print(result)
{
    "WHEAT": ["wheat"],
    "ENCHANTED_BREAD": ["enchanted bread", "ebread", "bread"],
    "HAY_BLOCK": ["hay bale", "haybale"],
    "ENCHANTED_HAY_BLOCK": ["enchanted hay bale", "ebale", "ehayblock"],
    "TIGHTLY_TIED_HAY_BALE": ["tightly-tied hay bale", "tightly tied hay bale"],
}

我没有运行此命令来检查语法,但可能类似于:

regex = "if (\(name == \"\w+\"\)( or )?)+\n\sreturn (\"[\w\s]+\")"

说明: \w等同于[a-zA-Z0-9_](即字母数字或下划线) \s是空白

因此,我们匹配if,然后尽可能多地(至少一次)匹配组与(name == "some_string")和可选的or,然后匹配换行符,然后是空格,直到返回语句,当我们匹配组的返回值时

对于这个正则表达式提供的每个匹配,您应该得到这两个组,一个包含所有可能的有效输入,另一个包含输出

希望这能让你找到一个完整的解决方案

文档链接:https://docs.python.org/3/howto/regex.html

相关问题 更多 >