正規表現を使って探す場合、「正規表現を扱う関数」と「探したいもの」と「検索される文字列」の三つを使います。
python
1>>> import re
2>>> re.search('語', '日本語')
3<re.Match object; span=(2, 3), match='語'>
4>>> re.search('語', '日本人')
5>>> re.search('語', '英語')
6<re.Match object; span=(1, 2), match='語'>
7
この場合、三つの文に共通して「正規表現を扱う関数」はre.searchで、「探したいもの」は'語'です。
一方、「検索される文字列」は'日本語'、'日本人'、'英語'とそれぞれ異なっています。
「探したいもの」のことをパターンとかパターン文字列とか正規表現パターンと呼びます。また、パターン文字列の一部分のことをパターンと呼ぶこともあります。
ご質問は、「検索される文字列」に'山川川'、'abb'が含まれているときに、'?'というパターン文字列が検索されないのはなぜかという意味に読めました。つまり、
python
1>>> re.search('a?', 'abb')
2<re.Match object; span=(0, 1), match='a'>
で、match='abb'ではなく、match='a'となるのがわからないというように読めました。
その理由は、「直前のパターンを0もしくは1回繰り返す」はパターンの側について書いているのであって、「検索される文字列」について書いているのではないからです。
'a?'というパターンは、まず「a」というパターンがあり、その次には直前のパターンである「a」を0もしくは1回繰り返す、という意味です。つまり、aが0回か1回あるという意味になります。
python
1>>> re.search('a?', 'xbb')
2<re.Match object; span=(0, 0), match=''>
で''が見つかるのはaが0回でも良いからです。
python
1>>> re.search('ab?c', 'acbb')
2<re.Match object; span=(0, 2), match='ac'>
なら、aが1回あり、bが0回か1回あり、cが1回あるというパターンなので'ac'が見つかります。