Вы передаете одиночные строки , потому что вы перебираете открытый файл, на который ссылается case
.Регулярному выражению никогда не передается ничего, кроме одной строки текста.Каждое из ваших регулярных выражений может соответствовать некоторым строкам, но они не все вместе соответствуют одной и той же строке.
Вы должны прочитать более одной строки.Если файл достаточно мал, просто прочитайте его как одну строку:
with open("text.txt", "r") as case:
case_text = case.read()
, затем примените ваши регулярные выражения к этой одной строке.
Или вы можете протестировать каждый из соответствующих объектов в отдельности., а не как группа, и выведите только те, которые соответствуют:
if presiding_match:
print(presiding_match.group(1))
elif judge2_match:
print(judge2_match.group(1))
elif judge3_match:
print(judge3_match.group(1))
, но тогда вам придется создать дополнительную логику, чтобы определить, когда вы закончите чтение из файла и выйдете из цикла.
Обратите внимание, что шаблоны, которые вы подходите, не разбиты на строки, поэтому флаг DOTALL
здесь на самом деле не нужен.Вы сопоставляете .*
текст, поэтому вы рискуете сопоставить слишком много , если вы используете DOTALL
:
>>> import re
>>> case_text = """Considered and decided by Hemingway, Presiding Judge; Bell, Judge; and
...
... Dickinson, Emily, Judge.
... """
>>> 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)
>>> presiding.search(case_text).groups()
('Hemingway',)
>>> judge2.search(case_text).groups()
('Bell',)
>>> judge3.search(case_text).groups()
('Considered and decided by Hemingway, Presiding Judge; Bell, Judge; and \n\nDickinson, Emily',)
Я бы хотя бы заменил [A-Z].*
на[A-Z][^;\n]+
, до не менее , исключая совпадающие ;
точки с запятой и символы новой строки и сопоставляя только имена длиной не менее 2 символов.Просто сбросьте флаги DOTALL
:
>>> presiding = re.compile(r'by\s*?([A-Z][^;]+),\s+?Presiding\s+?Judge;')
>>> judge2 = re.compile(r'Presiding\s+?Judge;\s+?([A-Z][^;]+),\s+?Judge;')
>>> judge3 = re.compile(r'([A-Z][^;]+), Judge\.')
>>> presiding.search(case_text).groups()
('Hemingway',)
>>> judge2.search(case_text).groups()
('Bell',)
>>> judge3.search(case_text).groups()
('Dickinson, Emily',)
Вы можете объединить три шаблона в один:
judges = re.compile(
r'(?:Considered\s+?and\s+?decided\s+?by\s+?)?'
r'([A-Z][^;]+),\s+?(?:Presiding\s+?)?Judge[.;]'
)
, который может найти всех судей в ваших входах за один раз с помощью .findall()
:
>>> judges.findall(case_text)
['Hemingway', 'Bell', 'Dickinson, Emily']