You can use the any() function to test each of the words in your list against a column:
if not any(w in row[3] for w in notstrings):
# none of the strings are found, write the row
This will be true if none of those strings appear in row[3]. It'll match substrings, however, so false-positive would be a match for 'a' in 'false-positive for example.
Put into context:
with open('output.csv', 'wb') as outf:
with open('input.csv', 'rbU') as inf:
read = csv.reader(inf)
outwriter = csv.writer(outf)
notstrings = ['and', 'or', '&', 'is', 'a', 'the']
for row in read:
if not any(w in row[3] for w in notstrings):
outwriter(row)
If you need to honour word boundaries then a regular expression is going to be a better idea here:
notstrings = re.compile(r'(?:\b(?:and|or|is|a|the)\b)|(?:\B&\B)')
if not notstrings.search(row[3]):
# none of the words are found, write the row
I created a Regex101 demo for the expression to demonstrate how it works. It has two branches:
\b(?:and|or|is|a|the)\b - matches any of the words in the list provided they are at the start, end, or between non-word characters (punctuation, whitespace, etc.)
\B&\B - matches the & character if at the start, end, or between non-word characters. You can't use \b here as & is itself not a word character.
row[3]? Is it a sentence? Is there punctuation? Should only whole words be matched?row[0]is the 1st column, etc.