【问题标题】:Splitting up a string by regex with multiple capture groups and OR | operators通过正则表达式与多个捕获组和 OR | 拆分字符串运营商
【发布时间】:2021-12-07 15:27:04
【问题描述】:
import re
splitRegex = r"(Personal Info|Personal|Personal Information)|(Work Experience|Work)|(Education|School|Certificates)"

text = "Personal Info\nText\nText\nText\nText\nWork Experience\nText\nText\nText\nText\nEducation\nText\nText\nText\nText\nText"

x = [tuple(i.splitlines()) for i in re.split(splitRegex, text) if i != ""]
d = dict([("".join(x[i]), x[i + 1]) for i in range(0, len(x) // 2, 2)])
print(d)

在上面的示例代码中,我想根据标题拆分文本。我想通过正则表达式确定这些标题(因为可以有同义词)re.split 但通常返回 NoneType。这显然会导致错误。如果我添加一个 if 条件来检查我是否不是 None,那么错误就会消失,但字典最终会丢失很多数据。

有没有人知道解决这个问题的方法或实现相同目标的方法?

请记住,以上只是一个示例。我需要将其用于简历/简历,因此布局和标题可能会根据使用的简历略有不同。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您将获得所有不匹配的组的None,因为re.split() 包括结果列表中的所有捕获组。

    您应该将每个备选列表放在一个非捕获组中,然后将它们全部放在一个捕获组中,这样您就可以得到匹配的标签。

    splitRegex = r"((?:Personal Info|Personal|Personal Information)|(?:Work Experience|Work)|(?:Education|School|Certificates))"
    

    【讨论】:

    • 这确实修复了整个 NoneType 错误,这很棒!但由于某种原因,我仍然最终会丢失数据。 (例如字典中的 67 行(包括标题)与总行数 80 行)
    • 我注意到,如果我将 re.split 调用分开,它确实会找到所有数据,所以在 if 条件的某个地方出现了问题。但我不明白为什么..
    • 如果你能做一个小例子来说明问题,我可以尝试诊断它。
    【解决方案2】:

    您可以在循环级别去掉结果中的NoneType

        x = [tuple(i.splitlines()) for i in re.split(splitRegex, text) if (i != "" and i != None)]
    

    这样x 将类似于:

        [('Personal Info',), ('', 'Text', 'Text', 'Text', 'Text'), 
        ('Work Experience',), ('', 'Text', 'Text', 'Text', 'Text'), 
        ('Education',), ('', 'Text', 'Text', 'Text', 'Text', 'Text')]
    

    这可能会让你的 dict 构造函数开心。

    【讨论】:

    • 我试过这个,但它似乎导致大量数据丢失。在我的示例数据中,原始数据似乎有大约 115 行,而字典最终大约有 85 行。
    • @SanderBerntsen 也许您可以发布更多数据,类似于您实际拥有的数据,特别是与您的脚本丢失的行类似的行。
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多