Maybe, here we could ignore ( and ) and see the desired output:
(.*?)(?:[()]|)
RegEx
If this wasn't your desired expression, you can modify/change your expressions in regex101.com.
RegEx Circuit
You can also visualize your expressions in jex.im:

JavaScript Demo
const regex = /(.*?)(?:[()]|)/gm;
const str = `(an) apple (device)
apple device`;
const subst = `$1`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
Python Test
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"(.*?)(?:[()]|)"
test_str = ("(an) apple (device)\n"
"apple device")
subst = "\\1"
# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
if result:
print (result)
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
RegEx
If you wish to literally check for correct answers, you might want to do it word by word. Maybe, this expression would work:
^((an|one)?(\s?)([aple]+)?(\s?)([devic]+)?)$

Python Code
You can simply add an if
for match and not match:
# -*- coding: UTF-8 -*-
import re
string = "an apple device"
expression = r'^((an|one)?(\s?)([aple]+)?(\s?)([devic]+)?)$'
match = re.search(expression, string)
if match:
print("YAAAY! \"" + match.group(1) + "\" is a match ")
else:
print(' Sorry! No matches!')
Output
YAAAY! "an apple device" is a match
JavaScript Demo for Full Match and Groups
const regex = /^((an|one)?(\s?)([aple]+)?(\s?)([devic]+)?)$/gm;
const str = `an apple device
an apple
apple device
apple
one apple
one appl device
two apple deive
on apple device
a apple device`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Then, you can add any other chars that you wish to the list, such as parentheses:
^(((one|an)+)?(\s?)([aple()]+)?(\s?)([()devic]+)?)$

This would also pass some misspelled words, which I 'm guessing that would be desired. If not, you can simply remove []
and use capturing groups with logical ORs:
(apple|orange|banana)?