为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 re.DOTALL 在多行文本中搜索正则表达式模式?

如何使用 re.DOTALL 在多行文本中搜索正则表达式模式?

撒科打诨 2021-09-28 18:10:38
我是一名律师和 python 初学者,所以我既 (a) 愚蠢又 (b) 完全不在我的车道上。我正在尝试将正则表达式模式应用于文本文件。该模式有时可以跨越多条线。我对文本文件中的这些行特别感兴趣:Considered  and  decided  by  Hemingway,  Presiding  Judge;  Bell, Judge;  and \n \nDickinson, Emily, Judge.我想单独搜索,提取,然后打印评委的名字。到目前为止,我的代码如下所示:import redef judges():    presiding = re.compile(r'by\s*?([A-Z].*),\s*?Presiding\s*?Judge;', re.DOTALL)    judge2 = re.compile(r'Presiding\s*?Judge;\s*?([A-Z].*),\s*?Judge;', re.DOTALL)    judge3 = re.compile(r'([A-Z].*), Judge\.', re.DOTALL)    with open("text.txt", "r") as case:        for lines in case:            presiding_match = re.search(presiding, lines)            judge2_match = re.search(judge2, lines)            judge3_match = re.search(judge3, lines)            if presiding_match or judge2_match or judge3_match:                print(presiding_match.group(1))                print(judge2_match.group(1))                print(judge3_match.group(1))                break当我运行它时,我可以得到 Hemingway 和 Bell,但是在两次换行之后我得到了第三个判断的“AttributeError: 'NoneType' object has no attribute 'group'”。经过反复试验,我发现我的代码只读取第一行(直到“Bell, Judge; and”)然后退出。我认为 re.DOTALL 会解决它,但我似乎无法让它发挥作用。我已经尝试了一百万种方法来捕获换行符并获取整个内容,包括 re.match、re.DOTALL、re.MULTILINE、"".join、"".join(lines.strip()) 和任何内容否则我可以靠墙扔东西。几天后,我屈服于寻求帮助。感谢您所做的一切。(顺便说一句,我没有运气让正则表达式与 ^ 和 $ 字符一起工作。它似乎也讨厌 . 在 Judge3 正则表达式中的转义。)
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

re.search您可以使用re.findall一个非常简短且简单的模式来一次查找所有法官,而不是 multiple :


import re


text = """Considered  and  decided  by  Hemingway,  Presiding  Judge;  Bell, 

Judge;  and \n

 \n

Dickinson, Emily, Judge."""


matches = re.findall(r"(\w+,)?\s(\w+),(\s+Presiding)?\s+Judge", text)

print(matches)

哪个打印:


[('', 'Hemingway', '  Presiding'), ('', 'Bell', ''), ('Dickinson,', 'Emily', '')]

所有原始信息都在那里:每个法官的名字、姓氏和“主审属性”(如果主审法官与否)。之后,您可以将此原始信息输入到满足您需求的数据结构中,例如:


judges = []

for match in matches:

    if match[0]:

        first_name = match[1]

        last_name = match[0]

    else:

        first_name = ""

        last_name = match[1]

    presiding = "Presiding" in match[2]

    judges.append((first_name, last_name, presiding))

print(judges)

哪个打印:


[('', 'Hemingway', True), ('', 'Bell', False), ('Emily', 'Dickinson,', False)]

如您所见,现在您有一个元组列表,其中第一个元素是名字(如果在文本中指定),第二个元素是姓氏,第三个元素是bool法官是主审法官还是主审法官不是。


显然,该模式适用于您提供的示例。但是,由于(\w+,)?\s(\w+),(\s+Presiding)?\s+Judge是这样一个简单的模式,因此需要注意一些边缘情况,其中模式可能会返回错误的结果:

  • 只会匹配一个名字。名称 likeDickinson, Emily Mary将导致Mary检测为姓氏。

  • 姓氏之类的de Broglie只会导致Broglie匹配,因此de会丢失。

  • ...

您必须查看这是否符合您的需求,或者为您的数据问题提供更多信息。


查看完整回答
反对 回复 2021-09-28
  • 3 回答
  • 0 关注
  • 270 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信