Соответствие строк в Python?
У меня проблемы с сопоставлением строк в Python. То, что я пытаюсь сделать, это искать строки в таких документах и пытаться сопоставить каждую строку с конкретными фразами. Я читаю во всех строках и разбираю суп Beautfiul на раздетые строки, затем перебираю список всех строк в документе. Оттуда я использую следующий код для соответствия определенным строкам:
if row.upper() == ("AUDIT COMMITTEE REPORT" or "REPORT OF THE AUDIT COMMITTEE"):
print("Found it!")
if "REPORT" in row.upper():
print ("******"+row.upper()+"******")
Когда код запускается, я получаю следующий вывод:
******COMPENSATION COMMITTEE REPORT******
******REPORT OF THE AUDIT COMMITTEE******
******REPORTING COMPLIANE******
******COMPENSATION COMMITTEE REPORT******
******REPORT OF THE AUDIT COMMITTEE******
Программа никогда не находит ее, когда строка проверяется на равенство, но когда ее спрашивают, есть ли ее часть в строке, она может найти ее без проблем. Как работает сопоставление строк в Python, когда происходят эти события, и как я могу исправить это, чтобы он произвел эти точные фразы?
РЕДАКТИРОВАТЬ: Еще одно примечание, которое следует сделать, это то, что эти документы довольно большие, некоторые из них легко превышают 50 страниц, и проверки, находится ли строка только в строке, недостаточно. Это должно быть точное совпадение.
2 ответа
Вы можете сделать что-то подобное, используя понимание списка.
row = '******AUDIT COMMITTEE REPORT******'
match = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]
is_match = sum([m in row.upper() for m in match])
if is_match:
print("Found it!")
if "REPORT" in row.upper():
print ("******"+row.upper()+"******")
Сначала мы создаем список всех возможных совпадений, которые могут быть загружены из файла или статически объявлены в коде Python.
match = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]
Затем мы перебираем все возможные совпадения и видим, соответствует ли что-либо строке row
, Если что-то совпадает, то в список будет добавлено истинное логическое значение, и мы можем использовать это, чтобы определить, было ли совпадение.
is_match = sum([m in row.upper() for m in match])
Если вы удалите sum()
Вы можете видеть, что вывод понимания списка - это просто список логических значений.
print([m in row.upper() for m in match])
[True, False]
Если вы хотите быть немного более эффективным и простым, вы можете реализовать функцию с циклом for.
matches = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]
def is_match(row):
for match in matches:
if match in row.upper():
return True
return False
Этот цикл будет перебирать все возможные совпадения, если он найдет совпадение, он немедленно вернет True, в противном случае он выйдет и вернет False.
Как насчет этого,
if row.upper() in ("AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"):
print("Found it!")
if "REPORT" in row.upper():
print ("******"+row.upper()+"******")
Обратите внимание, что ("str1" or "str2")
возвращает первую строку, т.е. 'str1'
,
>>> ("AUDIT COMMITTEE REPORT" or "REPORT OF THE AUDIT COMMITTEE")
'AUDIT COMMITTEE REPORT'