2015-04-18 3 views
1

Я новичок в Python и интересно, что это лучший способ, чтобы написать код, приведенный ниже в Perl в Python:Easy/Простой способ записи переключательных регулярные выражения

if ($line =~ /(\d)/) { 
    $a = $1 
} 
elsif ($line =~ /(\d\d)/) { 
    $b = $1 
} 
elsif ($line =~ /(\d\d\d)/) { 
    $c = $1 
} 

То, что я хочу сделать, это получить определенную часть каждой строки в большом наборе строк. В python все, что я могу сделать, это как показано ниже и очень уродливо.

res = re.search(r'(\d)', line) 
if res: 
    a = res.group(1) 
else: 
    res = re.search(r'(\d\d)', line) 
    if res: 
    b = res.group(1) 
    else: 
    res = re.search(r'(\d\d\d)', line) 
    if res: 
     c = res.group(1) 

Кто-нибудь знает лучший способ написать то же самое без встроенного модуля?

EDIT:

Как вы пишете, если вам нужно разбора строки, используя очень разные ре? Моя точка зрения здесь должна быть простой, чтобы любой мог понять, что там делает код. В Perl'е, мы можем написать:

if ($line =~ /^this is a sample line (.+) and contain single value$/) { 
    $name = $1 
} 
elsif ($line =~ /^this is another sample: (.+):(.+) two values here$/) { 
    ($address, $call) = ($1, $2) 
} 
elsif ($line =~ /^ahhhh thiiiss isiss (\d+) last sample line$/) { 
    $description = $1 
} 

Из моей точки зрения, этот вид перловый код очень прост и легко понять.

EDIT2: я нашел же обсуждение здесь:

http://bytes.com/topic/python/answers/750203-checking-string-against-multiple-patterns

Таким образом, нет никакого способа, чтобы написать в питоне просто достаточно, как Perl ..

+3

вы можете использовать 'elif' –

+0

Можете ли вы поделиться, для какого значения $ line будет выполняться раздел elsif? ИМО, только если ($ line = ~/(\ d) /) 'достаточно для всех случаев; если условия не в обратном порядке. – shantanoo

+0

Вы даете значение по умолчанию, если b или c не совпадают? –

ответ

1

Вы могли бы написать себе вспомогательную функцию для сохранения результата матча на внешнюю области, так что вам не нужно реванша регулярного выражения в заявлении, если

def search(patt, str): 
    search.result = re.search(patt, str) 
    return search.result 

if search(r'(\d)', line): 
    a = search.result.group(1) 
elif search(r'(\d\d)', line): 
    b = search.result.group(1) 
elif search(r'(\d\d\d)', line): 
    c = search.result.group(1) 
0

Подобно PERL, кроме 'Elif' вместо «elsif» и «:» после теста, а не фигурные скобки (заменены на отступы) и необязательные круглые скобки. В Интернете есть много ресурсов, которые описывают инструкции Python и многое другое, что можно легко найти при поиске в Google.

if re.search(r'(\d)', line): 
    a = re.search(r'(\d)', line).group(1) 
elif re.search(r'(\d\d)', line): 
    b = re.search(r'(\d\d)', line).group(1) 
elif re.search(r'(\d\d\d)', line): 
    c = re.search(r'(\d\d\d)', line).group(1) 

Конечно, логика кода несовершенна, так как «B» и «с» никогда не получить набор, но я думаю, что это синтаксис вы искали.

+0

Пожалуйста, исправьте меня, если я ошибаюсь, но я думаю, что не могу получить значение, используя res.group (1), если я использую elif. –

+0

См. Добавленный код в моем ответе. –

+1

Это не работает правильно, потому что res не обновляется для каждого права вызова re.search? Мне нужно сделать что-то вроде «elif res = re.search (xx)» в каждом заявлении elif, но python не позволяет мне писать замену в выражении if. –

2

Заказ шаблона очень важен. Потому что, если вы используете этот шаблон (\d)|(\d\d)|(\d\d\d), первая группа будет соответствовать всем символам цифр. Таким образом, он не будет пытаться проверить следующие два шаблона, так как только первый шаблон найдет все совпадения.

res = re.search(r'(\d\d\d)|(\d\d)|(\d)', line) 
if res: 
    a, b, c = res.group(3), res.group(2), res.group(1) 

DEMO

+0

Yeap вы правы ... но как мы можем знать порядок вообще? – JuniorCompressor

+0

@JuniorCompressor простая, первая группа захвата ссылается на индекс 1. Таким образом, вы можете получить значения, полученные группой '(\ d \ d \ d)' из 'res.group (1)' –

+0

Нет. Я имел в виду, какое регулярное выражение использовать для первого в | – JuniorCompressor

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