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

我是一名律师和 python 初学者,所以我既 (a) 愚蠢又 (b) 完全不在我的车道上。


我正在尝试将正则表达式模式应用于文本文件。该模式有时可以跨越多条线。我对文本文件中的这些行特别感兴趣:


Considered  and  decided  by  Hemingway,  Presiding  Judge;  Bell, 

Judge;  and \n

 \n

Dickinson, Emily, Judge.

我想单独搜索,提取,然后打印评委的名字。到目前为止,我的代码如下所示:


import re

def 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 正则表达式中的转义。)


撒科打诨
浏览 271回答 3
3回答

万千封印

re.search您可以使用re.findall一个非常简短且简单的模式来一次查找所有法官,而不是 multiple :import retext = """Considered  and  decided  by  Hemingway,  Presiding  Judge;  Bell, Judge;  and \n \nDickinson, 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会丢失。...您必须查看这是否符合您的需求,或者为您的数据问题提供更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python