Применение нескольких шаблонов регулярных выражений в лямбда-выражении - PullRequest
0 голосов
/ 07 июня 2019

У меня довольно сложная проблема, и я подумал, сможет ли кто-нибудь из вас, кто умеет программировать, помочь мне: p

Я хочу использовать два шаблона регулярных выражений, используя одно лямбда-выражение.
Код применяется для столбца панд данных Dataframe.

Мы перебираем все элементы в столбце.Если строка содержит квадратную скобку '[', необходимо выполнить один шаблон регулярного выражения.Если строка не содержит квадратную скобку, необходимо выполнить другой шаблон регулярного выражения.

Два рабочих шаблона регулярных выражений можно найти ниже.
На данный момент они разделены, но я хочу их объединить.

У меня есть следующий код, который отлично работает:

chunk['http'] = chunk.loc[chunk['Protocol'] == 'HTTP', 'Information'].apply(
                    lambda x: re.sub(r'\b[^A-Z\s]+\b', '', x))


chunk['http'] = chunk.loc[chunk['Protocol'] == 'HTTP', 'Information'].apply(
                lambda x: re.sub(r'\[(.*?)\]', '', x))

Первое выражение сохраняет только значения в CAPS.Второе выражение хранит значения только в квадратных скобках.

Я попытался объединить их в следующем фрагменте кода:

chunk['http'] = chunk.loc[chunk['Protocol'] == 'HTTP', 'Information'].apply(
                    lambda x: re.sub(r'\b[^A-Z\s]+\b', '', x)) \
                    if '[' in x == False\
                    else re.sub(r'\[(.*?)\]', '', x)

Однако это возвращает следующую ошибку:

NameError: free variable 'x' referenced before assignment in enclosing scope

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Лямбда - это просто короткая функция, которая возвращает значение. Вместо этого вы можете написать свою функцию - def function_name(x) где-нибудь и сделать гораздо больше, чем в лямбде. Только не забудьте вернуть значение в конце!

def function_name(x):
    x = re.sub(r'\b[^A-Z\s]+\b', '', x)) # lambda by default returns the value of the expression, here 
    #I really didn't understood your if/else block, but it should be here
    return re.sub(r'\[(.*?)\]', '', x) #last value, as opposed to lambda, should explicitly use return statement

chunk['http'] = chunk.loc[chunk['Protocol'] == 'HTTP', 'Information'].apply(function_name)
1 голос
/ 07 июня 2019

Вы поставили круглые скобки. Должно быть

chunk['http'] = chunk.loc[chunk['Protocol'] == 'HTTP', 'Information'].apply(
                    lambda x: re.sub(r'\b[^A-Z\s]+\b', '', x) \
                    if '[' in x == False\
                    else re.sub(r'\[(.*?)\]', '', x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...