Regex для извлечения уникальной строки в новый столбец, получая ошибку «для просмотра требуется шаблон фиксированной ширины» - PullRequest
2 голосов
/ 29 января 2020

Мне нужна помощь для извлечения уникальных строк в отдельный столбец.

df = pd.DataFrame({'File Name':['90.12.21 / 02.05 / XO3 File Name Type', 
                                '10.22.43 / X.89 / XO20G9992 Document Internal Only',
                                'Phase 3',
                                '22.32.42.12 / 99.23 / XO2 Location Site 3: Park Triangle',
                                '38.23.99.22 / X.23 / XO28W9998 Block 4 Beach/Dock Camp',
                                '39.24.32.49 / 37.29 / Blue-print/Register Info Site (RISs)',
                                '23.21.53.32 / Q.21 / XO R9924 Location Place 5: Drive Place (Active)',
                                '   33.51.63.33 / X.21 / XO20W8812 Area Place 1: Beach Drive']}) 

Вот как выглядит в настоящее время информационный фрейм:

| File Name                                                            |
|----------------------------------------------------------------------|
| 90.12.21 / 02.05 / XO3 File Name Type                                |
| 10.22.43 / X.89 / XO20G9992 Document Internal Only                   |
| Phase 3                                                              |
| 22.32.42.12 / 99.23 / XO2 Location Site 3: Park Triangle             |
| 38.23.99.22 / X.23 / XO28W9998 Block 4 Beach/Dock Camp               |
| 39.24.32.49 / 37.29 / Blue-print/Register Info Site (RISs)           |
| 23.21.53.32 / Q.21 / XO R9924 Location Place 5: Drive Place (Active) |
| 33.51.63.33 / X.21 / XO20W8812 Area Place 1: Beach Drive             |

Вот как мне нужно, чтобы он выглядел:

| File Name                              |
|----------------------------------------|
| File Name Type                         |
| Document Internal Only                 |
|                                        |
| Location Site 3: Park Triangle         |
| Block 4 Beach/Dock Camp                |
| Blue-print/Register Info Site (RISs)   |
| Location Place 5: Drive Place (Active) |
| Area Place 1: Beach Drive              |

Вот мое попытанное решение:

Я знаю, что str.extract(r'') извлечет выражение Regex в новый столбец. Я также знаю, что в Regex «положительный взгляд назад» выберет все, что я хочу, в конце строки. Поэтому я создал положительное выражение для выражения Regex, которое захватывает большинство нужных мне строк: https://regexr.com/4t4ll. Это все еще не идеальное решение.

Но даже когда я пытаюсь извлечь свои выборы, используя эту строку кода: df['File Name'].str.extract(r'((?<=\/ XO\d |XO\d[0-9]\w\d\d\d\d | XO \w\d\d\d\d ).*)'), я получаю сообщение об ошибке: «для просмотра требуется шаблон фиксированной ширины».

Мне нужна помощь, чтобы выяснить, как заставить работать выражение Regex в str.extract(r'') и как я могу заставить свое выражение Regex захватывать все строки, которые появляются в конце каждой записи?

1 Ответ

2 голосов
/ 29 января 2020

Вы можете использовать

.*\s/(?:\s+XO[A-Z0-9\s]*\b)?\s+(.+)

См. Демоверсию regex .

Подробности

  • .* - 0+ символов, кроме символов перевода строки, как можно больше
  • \s - пробел
  • / - / char
  • (?:\s+XO[A-Z0-9\s]*\b)? - необязательный шаблон:
    • \s+ - 1+ пробелов
    • XO - XO
    • [A-Z0-9\s]* - 0+ заглавных букв или цифр с последующим
    • \b - граница слова
  • \s+ - 1+ пробелов
  • (.+) - группа 1 (что будет str.extract return): любые 1+ символов, кроме символов разрыва строки, как можно больше

В Pandas, используйте

df['Result'] = df['File Name'].str.extract(r'.*\s/(?:\s+XO[A-Z0-9\s]*\b)?\s+(.+)', expand=False).fillna('')

Результат:

                                   Result  
0  File Name Type                          
1  Document Internal Only                  
2                                          
3  Location Site 3: Park Triangle          
4  Block 4 Beach/Dock Camp                 
5  Blue-print/Register Info Site (RISs)    
6  Location Place 5: Drive Place (Active)  
7  Area Place 1: Beach Drive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...