Создание регистронезависимой функции поиска
Теперь, когда вы узнали различные методы регистронезависимого сравнения, давайте создадим практическую функцию поиска, которая может находить слова в тексте без учета регистра.
Создание функции поиска
- В WebIDE создайте новый файл и назовите его
search_function.py
.
- Добавьте следующий код для реализации простой регистронезависимой функции поиска:
def search_text(query, text):
"""
Search for a query in text, ignoring case.
Returns a list of all matching positions.
"""
## Convert both to lowercase for case-insensitive comparison
query_lower = query.lower()
text_lower = text.lower()
found_positions = []
position = 0
## Find all occurrences
while position < len(text_lower):
position = text_lower.find(query_lower, position)
if position == -1: ## No more matches
break
found_positions.append(position)
position += 1 ## Move to the next character
return found_positions
## Example text
sample_text = """
Python is a programming language that lets you work quickly and integrate systems effectively.
python is easy to learn, powerful, and versatile.
Many developers love PYTHON for its simplicity and readability.
"""
## Test search
search_query = "python"
results = search_text(search_query, sample_text)
## Display results
if results:
print(f"Found '{search_query}' at {len(results)} positions: {results}")
## Show each match in context
print("\nMatches in context:")
for pos in results:
## Get some context around the match (10 characters before and after)
start = max(0, pos - 10)
end = min(len(sample_text), pos + len(search_query) + 10)
context = sample_text[start:end]
## Highlight the match by showing the original case from the text
match_original_case = sample_text[pos:pos+len(search_query)]
print(f"...{context.replace(match_original_case, f'[{match_original_case}]')}...")
else:
print(f"No matches found for '{search_query}'")
- Сохраните файл и запустите его с помощью команды:
python3 search_function.py
Вы должны увидеть вывод, похожий на следующий:
Found 'python' at 3 positions: [1, 67, 132]
Matches in context:
...[Python] is a pro...
...ctively.
[python] is easy ...
...ers love [PYTHON] for its ...
Это показывает, что наша функция нашла "Python" в трех местах, независимо от того, было ли оно написано как "Python", "python" или "PYTHON". Функция также показывает каждое совпадение в его исходном контексте, сохраняя исходный регистр.
Улучшение функции поиска
Давайте улучшим нашу функцию, чтобы сделать ее более полезной, добавив возможность подсчитывать слова и обрабатывать совпадения целых слов:
Добавьте следующий код в файл search_function.py
:
def count_word_occurrences(word, text, whole_word=False):
"""
Count occurrences of a word in text, ignoring case.
If whole_word=True, only count complete word matches.
"""
word_lower = word.lower()
text_lower = text.lower()
if whole_word:
## Use word boundaries to match whole words only
import re
pattern = r'\b' + re.escape(word_lower) + r'\b'
matches = re.findall(pattern, text_lower)
return len(matches)
else:
## Simple substring counting
return text_lower.count(word_lower)
## Test the enhanced function
test_text = """
Python is great. I love python programming.
This python-script demonstrates case-insensitive searching.
The word "python" appears multiple times as a whole word and as part of other words.
"""
## Count all occurrences (including within words)
count_all = count_word_occurrences("python", test_text)
print(f"Total occurrences of 'python' (including within words): {count_all}")
## Count only whole word occurrences
count_whole = count_word_occurrences("python", test_text, whole_word=True)
print(f"Whole word occurrences of 'python': {count_whole}")
Запустите скрипт еще раз:
python3 search_function.py
Теперь вы должны увидеть дополнительный вывод:
Total occurrences of 'python' (including within words): 4
Whole word occurrences of 'python': 3
Это показывает, что "python" встречается в тексте 4 раза в общей сложности, но только 3 раза как целое слово (одно вхождение в "python-script" не является совпадением целого слова).
Тестирование различных сценариев
Давайте добавим еще один тест, чтобы показать, как наша функция обрабатывает разные типы текста:
## Add more test cases
test_cases = [
("Python programming is fun", "python", "Simple sentence with one occurrence"),
("Python, python, PYTHON!", "python", "Multiple occurrences with different cases"),
("No matches here", "python", "No matches"),
("Python-script and PythonProgram contain python", "python", "Mixed word boundaries")
]
print("\nTesting different scenarios:")
for text, search_word, description in test_cases:
whole_matches = count_word_occurrences(search_word, text, whole_word=True)
all_matches = count_word_occurrences(search_word, text)
print(f"\nScenario: {description}")
print(f"Text: '{text}'")
print(f" - Whole word matches: {whole_matches}")
print(f" - All matches: {all_matches}")
Добавьте этот код и запустите скрипт еще раз:
python3 search_function.py
Вы увидите подробный разбор того, как функция обрабатывает различные сценарии текста:
Testing different scenarios:
Scenario: Simple sentence with one occurrence
Text: 'Python programming is fun'
- Whole word matches: 1
- All matches: 1
Scenario: Multiple occurrences with different cases
Text: 'Python, python, PYTHON!'
- Whole word matches: 3
- All matches: 3
Scenario: No matches
Text: 'No matches here'
- Whole word matches: 0
- All matches: 0
Scenario: Mixed word boundaries
Text: 'Python-script and PythonProgram contain python'
- Whole word matches: 1
- All matches: 3
Это демонстрирует, как регистронезависимое сравнение может быть использовано в реальной функции поиска с возможностью обработки различных требований к поиску.
На следующем шаге мы применим эти техники для создания практического приложения для валидации пользовательского ввода.