当前位置: 首页 > 知识库问答 >
问题:

使用多个捕获组和OR|运算符通过regex拆分字符串

连成益
2023-03-14
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,那么错误就会消失,但字典最终会丢失大量数据。

有人知道解决这个问题的方法吗?或者知道实现同样的事情的方法吗?

请记住,以上只是一个例子。我需要使用这个为简历/简历,因此布局和标题可以略有不同,这取决于使用的简历。

共有2个答案

步衡
2023-03-14

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

您应该将每个备选方案列表放在一个非捕获组中,然后将所有备选方案都放在一个捕获组中,这样您就可以得到匹配的标签。

splitRegex = r"((?:Personal Info|Personal|Personal Information)|(?:Work Experience|Work)|(?:Education|School|Certificates))"
阮选
2023-03-14

您可以在循环级别删除结果中的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')]

这可能会让你的判决构造函数高兴。

 类似资料:
  • 如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(

  • Java官方文档说明: 例如,字符串使用以下表达式Regex Result生成以下结果: 这就是我需要它工作的方式。然而,如果我运行这个: 它打印: 这与我的预期相去甚远: 为什么会这样?

  • 问题内容: 我不明白这行的含义: 其中 参数 是字符串 为什么通常要对python字符串使用和运算符? 问题答案: 假设您使用的是的值,但如果说的是值,那么您希望使用一个空字符串代替。您一般会做什么? 这就是表达的意思。首先,你应该明白与运营商的作用: 返回如果是,否则返回。 返回如果是,否则返回。 所以,你的表情: 实际上等效于: 在以下情况下如何计算表达式: 评估为: result = (”

  • 这是作为输入的字符串,但我只需要每一列,从第二列开始,即: 1(第二行) 2和1(第三行) 1(第五排) 这个在可能有多少行或多少列(列被一个空格分割)方面没有固定的大小。 我认为通过使用以下工具,这相当容易: 我需要第一列之后的每一列。我仍在学习regex,但似乎找不到一个好的解决方案。我知道关于拆分的“\\r?\\n”和“”,但不知道如何将两者连接起来以获取每一列。非常感谢您的帮助:) 另一个

  • 我有一份清单 我如何迭代列表并解析所有字符串,以便在迭代结束时我可以有一个包含如下内容的字符串

  • 我正在尝试找到正则表达式以获得字符串的最后一个字符: 通过正则表达式查找最后一个字符应返回“F”。