使用正则表达式在多行文本字符串中查找可选行

时间:2018-09-28 11:34:33

标签: python regex python-3.x python-2.7 qregularexpression

我有一个文件,其中包含与该文件相似的文本(简化了行):

textfile.txt =

Domain XXX
    Description AAAA
    Part BBBB
    Id CCCC DDDD
    Next EEEE

我需要阅读大写字母并将其存储为dict中的值。以下语法似乎可行。

info = re.finditer(r"^(Domain (?P<domain_name>.*)\n)"
    r"( .*\n)*"
    r"( Description (?P<description>.*))\n"
    r"( .*\n)*"
    r"( Part (?P<part>.*))\n"
    r"( .*\n)*"
    r"( Id (?P<id_former>\S+) (?P<id_latter>\S+))\n"
    r"( .*\n)*"
    r"( Next (?P<next>\S+))\n"
    r"",
    textfile,
    re.MULTILINE)

此正则表达式语法的工作方式与我可以使用它来找到相关信息并使用以下命令再次调用它们:

for i in info:
    result["domain"]=i.group("domain_name")
    result["description"]=i.group("description")
    result["part"]=i.group("part")
    result["id_former"]=i.group("id_former")
    result["id_latter"]=i.group("id_latter")
    result["next"]=i.group("next")

print(result)
{'domain': 'XXX', 'description': 'AAAA', 'part': 'BBBB', 'id_former': 'CCCC', 'id_latter': 'DDDD', 'next': 'EEEE'}

我的问题是说明行仅是可选的。我的代码似乎需要找到 ALL 行,以便将它们包括在dict输出中,如果缺少描述,则会跳过整个过程。

如果在文本中找不到描述行,如何使查询的r"( Description (?P<description>.*))\n"部分仅返回一个空值。是否允许将其余属性存储在dict结果变量中?

1 个答案:

答案 0 :(得分:0)

虽然您可以在Regex中执行此操作,但也可以使用if "Description " in text检查并为True指定变量description = r"( Description (?P<description>.*))\n( .*\n)*"或为False指定变量description = r""

然后可以将description的变量+ description +插入您的finditer参数中。如果您解析多个块,每个块都有一个可选的Description条目,请首先从文本文件中拆分这些块来扩展它。