2014-09-24 3 views
-1

Это код:Как исправить: Ь = re.search ('.. (*) D + TLD', а)

a = '000.222.tld' 
b = re.search('(.*).\d+\.tld', a) 

хотел бы видеть, что печать

до сих пор ..

print b.group(0) 

дает мне это:

000.222.tld 

    print b.group(1) 

дает мне это:

000.2 
+0

Регулярное выражение в вашем коде даже не актуально; '\ (' экранируется, поэтому (неэкранированный) ')' ничего не соответствует. Я думаю, вы пытались написать группу захвата, и в этом случае вы не хотите скрывать скобки. Кроме того, вы всегда должны использовать необработанные строковые литералы с регулярными выражениями - знаете ли вы, что список обратного слэша Python настолько хорош, что вы можете точно сказать, означает ли '' \ d'' что-нибудь? – abarnert

ответ

1

Есть аа несколько проблем с выражением:

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 является вашим вторым. Просмотрите примеры и посмотрите, насколько проще найти проблемы с вашим шаблоном таким образом.

1

Вы можете сделать это без регулярных выражений:

b = a.split('.', 1)[0] 
+0

+1. И, наверное, тоже. Основная причина использования регулярного выражения заключается в том, что во многих случаях он позволяет вам выражать вещи, которые были бы такими неуклюжими или многословными, что их трудно было бы читать и поддерживать, если они были написаны строковыми методами. Если вы не можете понять, как писать и отлаживать регулярное выражение, а несколько попыток не приближают вас к пониманию, то даже если вы получите результат, вероятность того, что вам не будет более читаемым (и ваш предназначенные читателям), чем строковые методы. И в этом случае clunkiness минимален (даже если вы добавляете в подтверждение, что '[1]' был int и '[2]' was ''tld''). – abarnert

Смежные вопросы