Building a Case-Insensitive Search Function
Now that you've learned different methods for case-insensitive comparison, let's build a practical search function that can find words in text regardless of case.
Creating a Search Function
- In the WebIDE, create a new file and name it
search_function.py
.
- Add the following code to implement a simple case-insensitive search function:
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}'")
- Save the file and run it with:
python3 search_function.py
You should see output like:
Found 'python' at 3 positions: [1, 67, 132]
Matches in context:
...[Python] is a pro...
...ctively.
[python] is easy ...
...ers love [PYTHON] for its ...
This shows that our function found "Python" in three places, regardless of whether it was written as "Python", "python", or "PYTHON". The function also shows each match in its original context, preserving the original capitalization.
Enhancing the Search Function
Let's enhance our function to make it more useful by adding the option to count words and handle whole word matching:
Add the following code to your search_function.py
file:
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}")
Run the script again:
python3 search_function.py
You should now see additional output:
Total occurrences of 'python' (including within words): 4
Whole word occurrences of 'python': 3
This shows that "python" appears 4 times in total, but only 3 times as a whole word (one occurrence is in "python-script" which isn't a whole word match).
Testing Different Scenarios
Let's add one more test to show how our functions handle different types of text:
## 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}")
Add this code and run the script again:
python3 search_function.py
You'll see a detailed breakdown of how the function handles different text scenarios:
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
This demonstrates how case-insensitive comparison can be used in a real-world search function, with options to handle different searching requirements.
In the next step, we'll apply these techniques to create a practical user input validation application.