Python is becoming a popular programming language because it's both powerful and easy to learn, and it's great for exploring word lists. Here are some sample scripts to get you started.
Scripting is powerful and can often do searches RegEx can't, but remember, scripts can only find results from your word list. Searches with our Finder also include external dictionaries.
Click any yellow box below to copy that script to your clipboard.
Here's a simple script you can use as a template for exploring your own word list, whether you got it from us or you built it yourself.
Once you have a Python environment set up on your computer, you can copy and paste this script, change the "open" statement to point to your text file, and run it to find all the words that start and end with "x" or with the string "de" or whatever.
That's a very specific example, but to find the words you're looking for, all you have to do is replace the test at the end (if word.startswith...) with logic that fits your goal.
import sys # This example uses a try/except pattern to handle errors. # It's a common pattern in Python, and is the preferred way to handle errors. # The "except" block is only executed if an exception is raised in the "try" block. # Use this pattern in the other examples here if you like. class ExitWithMessage(Exception): pass try: # Get the search string from command line, or prompt if it's missing. # Strip off any leading or trailing spaces and convert to lowercase. pattern = sys.argv[1] if len(sys.argv) > 1 else input("Enter Start/End search string: ") pattern = pattern.strip().lower() # Bail if we didn't get a search string. if len(pattern) == 0: print("No search string specified") raise ExitWithMessage() # Open your word list file in read-only mode. # If it isn't in current directory, specify full path using forward slash ("/") not backslash. with open("XwiWordList.txt") as f: for line in f: parts = line.split(';') # Split the line into parts, using ";" as the delimiter word = parts[0].strip() # Get the first part of the line, the word before ";" score = int(parts[1]) # Score isn't used here but this is how you get it if word.startswith(pattern) and word.endswith(pattern): print(word) except ExitWithMessage: sys.exit()
A 2021 crossword played on the idea of words with or without the suffix ION. This modification to the program finds words with and without any suffix you enter.
import sys suffix = sys.argv[1] if len(sys.argv) > 1 else input("Enter suffix: ") suffix = suffix.strip().lower() suffix_length = len(suffix) if suffix_length == 0: sys.exit() count = 0 full_word_set = set() # Set automatically eliminates duplicates and is faster than list with open("XwiWordList.txt") as f: for line in f: parts = line.split(';') full_word = parts[0].strip().lower() full_word_set.add(full_word) # All words get added to set # if the word ends with our suffix, see if the word without the suffix is already in the set. # Note, this assumes words in alphabetical order, eg, PASS would precede PASSION in the list. if full_word.endswith(suffix): truncated_word = full_word[:-suffix_length] if truncated_word in full_word_set: print(f"{truncated_word} : {full_word}") count += 1 print(f'{count} found')
A 2022 crossword combined 4-letter words to build up 16-letter theme answers. This program searches a word list for all such possible answers. Variable types are declared. That's not necessary for these short programs, but it's good practice.
from typing import List, Set count: int = 0 # number of matches found Set4: Set[str] = set() # Set of all the 4-letter words for fast lookup List16: List[str] = [] # collection of all the 16-letter words with open("XwiWordList.txt") as f: for line in f: word: str = line.split(';')[0].strip().lower() if len(word) == 4: Set4.add(word) if len(word) == 16: List16.append(word) for word16 in List16: parts = [word16[i:i+4] for i in range(0, 16, 4)] if all(part in Set4 for part in parts): print(f'{parts[0]}-{parts[1]}-{parts[2]}-{parts[3]} = {word16}') count += 1 print(f'{count} found')
This script builds on the first sample by replacing the simple start/end test with a RegEx match.
You can explore RegEx on our Finder page and see some RegEx examples here.
import re, sys from typing import Pattern pattern: str = sys.argv[1] if len(sys.argv) > 1 else input("Enter RegEx: ") pattern = pattern.strip() if len(pattern) == 0: sys.exit() # Compile the pattern into a RegEx Object, so it only has to be evaluated once. prog: Pattern[str] = re.compile(pattern.replace("$v", "[aeiou]").replace("$c", "[^aeiou]"), re.IGNORECASE) count: int = 0 with open("XwiJeffChenList.txt") as f: for line in f: word: str = line.split(';')[0].strip().lower() if prog.search(word): print(word) count += 1 print(f'{count} found')
Specify, say, "aiouy" to show words where the only vowel (if any) is E.
Compare with these Finder results: *-AIOUY using OneLook, and ^[^AIOUY]+$ using Regex.
How would you change the script to select words that only contain letters you specify?
import sys eliminators = sys.argv[1] if len(sys.argv) > 1 else input("Enter letters to eliminate: ") eliminators = eliminators.strip().lower() if len(eliminators) == 0: sys.exit() eliminationSet = set(eliminators) # convert eliminators to set of characters to check with open("XwiWordList.txt") as f: for line in f: line = line.strip().lower() # removes \n parts = line.split(';') word = parts[0].strip() score = parts[1] if not any(x in line for x in eliminationSet): print(line)
This example is different. There's no user input. It sorts a copy of your word list so the highest value words are on top. Within each score, words are sorted by length, and then alphabetically within each score/length group.
I'm not saying this particular sort is useful, but it demonstrates how to do it.
If you do re-sort your word list with a Python script, you probably want to run your program from the command line and then "pipe" it to a new text file. Open a Command Prompt, navigate to your folder, and type something like: main.py > MyNewTextFile.txt
# Define the class AnswerWord that, for each word in our word list, # encapsulates the word, the length of the word, and the score. class AnswerWord(object): def __init__(self, word="", score=0): self.word = word self.length = len(word) self.score = score AnswerWordArray = [] # This array will hold a collection of AnswerWord objects with open("XwiWordList.txt") as f: for line in f: parts = line.split(';') AnswerWordArray.append(AnswerWord(parts[0].strip().lower(), int(parts[1]))) # Sort by score (descending), length (ascending), and word (ascending) in one pass AnswerWordArray.sort(key=lambda k: (-k.score, k.length, k.word)) for answerWord in AnswerWordArray: print(answerWord.word + ";" + str(answerWord.score))
Suppose you're not an experienced programmer. Artificial Intelligence can (sometimes) do an amazing job.
I gave GitHub Copilot this prompt: "Write a Python function to read lines from a text file and print out the ones that are palindromes."
Here's the 7-line function it came up with, complete with comments!
def print_palindromes(filename): with open(filename, 'r') as file: for line in file: line = line.strip().lower() # Remove leading/trailing white space and convert to lower case line = ''.join(ch for ch in line if ch.isalnum()) # Remove non-alphanumeric characters if line == line[::-1]: # Check if the line is the same forward and backward print(line)
If you change the ch.isalnum (is alpha-numeric) to ch.isalpha, it will even work with files that include word scores.
The rest is up to you, your ingenuity, and your creativity.
If you're serious about learning Python, XWord Info recommends PyCharm. The free "Community" version works fine. Visual Studio Code is also a great choice, and it's also free. Both are available for Windows, Mac, and Linux.