Как добавить условие в Regex? - PullRequest
1 голос
/ 13 февраля 2020

Я искал везде, но пока не нашел решения ... Так, например, у меня есть список имен в моем фрейме данных, такой как: Пенелопа Динс, Коринн М. Перселл, Салли Сиборн, Тереаса Т Аранда и так далее. Мой текущий Regex -

^[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+

, который ловит большую часть имени. Однако в фрейме данных у меня также есть строки типа «Лицензионная недвижимость в XXX, Digital Marketer в YYY». И вышеупомянутое Regex также ловит "Лицензионную недвижимость" и "Digital Marketer". Я хочу выбрать строки только с именами, и как мне это сделать? Могу ли я как-то написать регулярное выражение, чтобы не перехватывать какие-либо слова, включая слово «at»?

+++

Итак, я работаю над кадром данных только из одного столбца и множества строк, данных выглядит так:

lst = [Penelope Deans, 1/1/2020, Digital Marketer at XXX, Corinne M. Percell, 1/1/2020, Tereasa T., Licensed Real Estate at YYY]

df = pd.DataFrame(lst)

df

    Info 
0  Penelope Deans 
1  1/1/2020 
2  Digital Marketer at XXX 
3  Corinne M. Percell 
4  1/1/2020 
5  Tereasa T. 
6  Licensed Real Estate at YYY

name_pat = r"^[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+"
df['Info'].str.findall(name_pat)

Вывод

    Info 
0  Penelope Deans 
1  []
2  Digital Marketer
3  Corinne M. Percell 
4  [] 
5  Tereasa T. 
6  Licensed Real Estate

И я ожидаю как:

    Info 
0  Penelope Deans 
1  []
2  []
3  Corinne M. Percell 
4  []
5  Tereasa T. 
6  []

1 Ответ

0 голосов
/ 13 февраля 2020

Ключевым моментом является определение того, какое значение определяет имя, а какое нет.

Из ваших примеров видно, что 'Penelope Deans', 'Corinne M. Percell' и 'Tereasa T.' являются именами, а '1/1/2020' нет (потому что он имеет числа и косые черты), а 'Digital Marketer at XXX' тоже нет, потому что он следует шаблону <namelike> at <namelike>.

Обратите внимание, что по этим правилам 'John at Smith' не будет имя тоже. Но так как «at» не является нормальной дворянской частицей в английском языке sh, она должна работать, и вы не собираетесь специально охватывать иностранные имена (и даже тогда «at» редко встречается в имени).

Решение в Python с использованием регулярных выражений:

import pandas as pd

lst = [
    'Penelope Deans', '1/1/2020', 'Digital Marketer at XXX', 'Corinne M. Percell', 
    '1/1/2020', 'Tereasa T.', 'Licensed Real Estate at YYY'
]

df = pd.DataFrame(lst)

df = df[df[0].str.match('^((?! at )[A-z\s\.])+$')]

print(df)

Результат:

                    0
0      Penelope Deans
3  Corinne M. Percell
5          Tereasa T.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...