Есть аа несколько проблем с выражением:
b = re.match('\(.*)\.\d+\.com', a)
Во-первых, что \(
означает, что вы избегаете (
-it будет соответствовать только литералу (
персонажу в строка поиска. Вы не пытаетесь сопоставить любые круглые скобки, вы пытаетесь создать группу захвата, поэтому не избегайте парнеров. (Кроме того, вы не избежать соответтсвующее )
, поэтому вы получите ошибку о несогласованных скобок пытаются использовать это ...)
Во-вторых, вы пытаетесь соответствовать .com
, но ваш входной образец заканчивается .tld
. Очевидно, что они не совпадут. Предположительно, вы хотели сопоставить любую строку букв или какое-то другое правило?
Наконец, вы не используете строковый строковый литерал или избегаете обратных косых черт. Иногда вам это удается, но знаете ли вы, что правила управления обратным слэшем на Python наизусть так хорошо, что вы можете быть уверены, что \d
или \.
ничего не значит? Вы ожидаете, что кто-нибудь, кто прочитает ваш код, также будет знать?
Если устранить все эти проблемы, ваше регулярное выражение работы:
>>> a = '1.2.tld'
>>> b = re.match(r'(.*)\.\d+\.[A-Za-z]+', a)
>>> b.group(1)
'1'
Теперь, когда вы полностью изменили как выражение и вход, вы должны полностью различные проблемы:
b = re.search('(.*).\d+\.tld', a)
Основная проблема здесь, опять же, не используя строковый литерал, заключается в том, что вы не избежали первого .
, так что вы ищете любого персонажа. Так как регулярные выражения жадные по умолчанию, первый .*
будет захватывать столько, сколько он может, оставляя место для любого персонажа, 1 или более цифр и .tld
, поэтому он будет соответствовать 000.2
. Но если вы избежите .
, он будет захватывать столько, сколько может, оставив место для буквального .
, 1 или более цифр и .tld
, что именно то, что вы хотите.
>>> a = '000.222.tld'
>>> b = re.search(r'(.*)\.\d+\.tld', a)
>>> b.group(1)
'000'
Между тем, есть некоторые большие регулярные выражения отладчики, как скачиваемые игры и онлайн. Я не хочу рекомендовать его в частности, но Debuggex упрощает создание разделяемой ссылки на конкретный тест, поэтому here является вашим первым, а here является вашим вторым. Просмотрите примеры и посмотрите, насколько проще найти проблемы с вашим шаблоном таким образом.
Регулярное выражение в вашем коде даже не актуально; '\ (' экранируется, поэтому (неэкранированный) ')' ничего не соответствует. Я думаю, вы пытались написать группу захвата, и в этом случае вы не хотите скрывать скобки. Кроме того, вы всегда должны использовать необработанные строковые литералы с регулярными выражениями - знаете ли вы, что список обратного слэша Python настолько хорош, что вы можете точно сказать, означает ли '' \ d'' что-нибудь? – abarnert