Is there a face in this image?
JavaScript (ES6),  147 ... 140  139 bytes
Returns either false or a truthy value.
s=&gt;(p='',g=k=&gt;s.replace(/[^7o_]/g,0).match(`o${p}${p+=0}o${S=`.{${w=s.search`
`-k}}(0${p+p}.{${w}})*`}${p+7+p+S}__{${k}}`)||w&gt;0&amp;&amp;g(k+2))(2)

Try it online!
How?
We start with \$k=2\$ and \$p\$ set to an empty string.
At each iteration, we first replace all characters in the input string \$s\$ other than &quot;o&quot;, &quot;7&quot; or &quot;_&quot; with zeros. This includes linefeeds. So the first test case:
...o.....o.
......7....
..._______.

is turned into:
flat representation: &quot;...o.....o.¶......7....¶..._______.&quot;
after replace()    : &quot;000o00000o00000000700000000_______0&quot;

We then attempt to match the 3 parts of a face of width \$k+1\$.
Eyes
An &quot;o&quot; followed by \$k-1\$ zeros, followed by another &quot;o&quot;:
`o${p}${p+=0}o`

Followed by the padding string \$S\$ defined as:
`.{${w=s.search('\n')-k}}(0${p+p}.{${w}})*`
 \______________________/ \____________/ |
   right / left padding      k+1 zeros   +--&gt; repeated any
                          + same padding      number of times

Nose
\$k/2\$ zeros, followed by a &quot;7&quot;, followed by \$k/2\$ zeros, followed by the same padding string \$S\$ as above:
`${p+7+p+S}`

Mouth
\$k+1\$ underscores:
`__{${k}}`

In case of failure, we try again with \$k+2\$. Or we stop as soon as the variable \$w\$ used to build \$S\$ is less than \$1\$, meaning that the padding string would become inconsistent at the next iteration.
For the first test case, we successively get the following patterns:
o0o.{9}(000.{9})*070.{9}(000.{9})*__{2}
o000o.{7}(00000.{7})*00700.{7}(00000.{7})*__{4}
o00000o.{5}(0000000.{5})*0007000.{5}(0000000.{5})*__{6}

The 3rd one is a match.