Is It Possible to Select Faces (in Edit Mode) Based on the Normals of the Faces Connected to It? I understand how weirdly specific this is, but is there no way to select faces based on the normals they're facing AND the adjacent faces' normals?
What I want is a little complicated, but if I were to have a subdivided cube with perfectly flat faces, would I be able to select every face on the X positive normal but make an exception for any face that's connected to a different face with a Z positive normal?

I've tried putting specific selections into different vertex groups, but I'ven't been getting much luck using that work around. Could I not use python to make a custom search and dot in my own parameters?
[EDIT 1]
Alright, thinking a little better this time, I realised that what I was asking was odd because of the examples I used. So, I'm editing this to better clarify, using a model that correlates much better to the issue I'm having.
I suppose there'd be 2 options to what I'm asking: &quot;select adjacent faces of normal based on the faces' normals&quot; or &quot;limit selection of faces based on the connected faces' normals.&quot; Though in all fairness, I'd only profit from the 2nd case. Giving examples now.
In the first case, &quot;select adjacent faces of normal based on faces' normals,&quot; I've set up an example. In this case, I asked to select all the Z+ normals AND select adjacent faces that have the Y- normal. As you can see, only the faces that are making contact with the Z+ faces are selected.

In the second case, &quot;limit selection of faces based on the connected faces' normals,&quot; I've another example. Again, I ask to select all Z+ faces, but this time, avoid any faces that are on the Y- normal.

Is there any way to do this? Not a big deal if there isn't, I just spent the better part of my day trying to do something like the earlier 2nd example with only commands and couldn't.
Select +Z faces and neighboring -Y faces if they go down:
import bpy, bmesh
from mathutils import Vector

up = Vector((0, 0, 1))
side = Vector((0, -1, 0))

def main():
    me = bpy.context.active_object.data
    bm = bmesh.from_edit_mesh(me)
    for face in bm.faces:
        if face.normal == up:
            face.select = True
            conditional_select_neighbors(face)
    bmesh.update_edit_mesh(me)


def conditional_select_neighbors(face):
    for loop in face.loops:  # each edge has a 'loop' associated with it for each face
        loop2 = loop.link_loop_radial_next  # radial_next gets the loop of the same edge but another face
        is_side = loop2.face.normal == side  # as R. Betts spotted, this is not enough
        loop3 = loop2.link_loop_next.link_loop_next
        is_lower = loop.vert.co.z &gt; loop3.vert.co.z  
        if is_side and is_lower:
            loop2.face.select = True


if __name__ == &quot;__main__&quot;:
    main()

Select +Z faces without -Y neighbors:
import bpy, bmesh
from mathutils import Vector

up = Vector((0, 0, 1))
side = Vector((0, -1, 0))

def main():
    me = bpy.context.active_object.data
    bm = bmesh.from_edit_mesh(me)
    for face in bm.faces:
        if face.normal == up:
            conditional_select(face)
    bmesh.update_edit_mesh(me)


def conditional_select(face):
    face.select = True
    for loop in face.loops:  # each edge has a 'loop' associated with it for each face
        loop2 = loop.link_loop_radial_next  # radial_next gets the loop of the same edge but another face
        if loop2.face.normal == side:  # in this case this is enough
            face.select = False


if __name__ == &quot;__main__&quot;:
    main()