Как преобразовать регулярное выражение в Python из Perl - PullRequest
3 голосов
/ 16 декабря 2010

в Perl:

 if ($test =~ /^id\:(.*)$/ ) {

 print $1;

 }

Ответы [ 4 ]

15 голосов
/ 16 декабря 2010

В Python:

import re

test = 'id:foo'

match = re.search(r'^id:(.*)$', test)
if match:
    print match.group(1)

В Python регулярные выражения доступны через библиотеку re .

r перед строкой указывает, что это необработанный строковый литерал , что означает, что обратный слеш не обрабатывается особым образом (в противном случае каждый обратный слеш должен был бы быть экранирован с помощью другого обратного слеша для буквального обратного слеша пробраться в строку регулярных выражений).

Я использовал re.search здесь, потому что это самый близкий эквивалент оператора Perl =~. Есть другая функция re.match, которая делает то же самое, но проверяет только совпадение, начинающееся в начале строки (противоречит интуитивному определению Perl для «соответствия»). См. это объяснение для получения полной информации о различиях между ними.

Также обратите внимание, что нет необходимости экранировать :, поскольку он не является специальным символом в регулярных выражениях.

4 голосов
/ 16 декабря 2010
match = re.match("^id:(.*)$", test)
if match:
    print match.group(1)
0 голосов
/ 16 марта 2018

Я написал этот конвертер регулярных выражений Perl в Python, когда мне пришлось переписать кучу регулярных выражений Perl (много) в вызовы пакетов re Python. Он охватывает некоторые основные вещи, но может быть полезным во многих отношениях:

def convert_re (perl_re, string_var='column_name', 
                test_value=None, expected_test_result=None):
    '''
        Returns Python regular expression converted to calls of Python `re` library
    '''

    match = re.match(r"(\w+)/(.+)/(.*)/(\w*)", perl_re)

    if not match:
        raise ValueError("Not a Perl regex? "+ perl_re)

    if not match.group(1)=='s':
        raise ValueError("This function is only for `s` Perl regexpes (substitutes), i.e s/a/b/")

    flags = match.group(4)

    if 'g' in flags:
        count=0     # all matches
        flags=flags.replace('g','') # remove g
    else:
        count=1     # one exact match only

    if not flags:
        flags=0

    # change any group references in replacements like \2 to group references like \g<2>
    replacement=match.group(3)
    replacement = re.sub(r"\$(\d+)", r"\\g<\1>", replacement)

    python_code = "re.sub(r'{regexp}', r'{replacement}', {string}{count}{flags})".format(
                    regexp=match.group(2)
                ,   replacement=replacement
                ,   string=string_var
                ,   count=", count={}".format(count) if count else ''
                ,   flags=", flags={}".format(flags) if flags else ''
            )

    if test_value:
        print("Testing Perl regular expression {} with value '{}':".format(perl_re, test_value))
        print("(generated equivalent Python code: {} )".format(python_code))
        exec('{}=r"{}"; test_result={}'.format(string_var, test_value, python_code))
        assert test_result==expected_test_result, "produced={} expected={}".format(test_result, expected_test_result)
        print("Test OK.")

    return string_var+" = "+python_code

print convert_re(r"s/^[ 0-9-]+//", test_value=' 2323 col', expected_test_result='col')

print convert_re(r"s/[+-]/_/g", test_value='a-few+words', expected_test_result='a_few_words')
0 голосов
/ 16 декабря 2010

Используйте RegexObject, как указано здесь: http://docs.python.org/library/re.html#regular-expression-objects

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...