удалить текст между скобками и изменить положение слов внутри строки - PullRequest
1 голос
/ 13 июля 2020

У меня есть следующий pandas фрейм данных:

pandas_dataframe = pd.DataFrame({'movie': ['Discreet Charm of the Bourgeoisie, The (Charme discret de la bourgeoisie, Le)',
                                           'Attack Force Z (a.k.a. The Z Men) (Z-tzu te kung tui)',
                                           'State of Things, The (Stand der Dinge, Der)',
                                           'Happy Tour, A',
                                           'Awfully Big Adventure, An',
                                           'American President, The'],
                                 'genre': ['Action', 'Comedy', 'Drama', 'Children', 'Action', 'Documentary']})
pandas_dataframe

Я хочу применить два преобразования:

  • Удалить любой текст внутри скобок '(xxx)'
  • Переместите слово «The» или «A» перед текстом, если это применимо (т.е. только в первом и третьем mov ie title)

Мой последний фрейм данных должен выглядеть так это:

+---------------------------------------+------------+
| movie                                 | genre      |
+---------------------------------------+------------+
| The Discreet Charm of the Bourgeoisie | Action     |
| Attack Force Z                        | Comedy     |
| The State of Things                   | Drama      |
| A Happy Tour                          | Children   |
| An Awfully Big Adventure              | Action     |
| The American President                | Documentary|
+---------------------------------------+------------+

Я знаю, что для первого преобразования следует применить выражение регулярного выражения. Хотя, когда я пытаюсь сделать следующее:

exp = r'\([^]*\)'
pandas_dataframe['movie'] = pandas_dataframe['movie'].apply(lambda x: re.sub(exp,"",x).strip())

, я получаю эту ошибку: error: unterminated character set at position 2

В моем последнем редактировании я добавил еще несколько случаев фильмов со словами An, A для изменения положения . Прошу прощения за то, что не включил их в первую очередь.

1 Ответ

3 голосов
/ 13 июля 2020

Исходные требования:

  • переместить «The» в начало предложения
  • удалить текст в круглых скобках

Это перемещает «The» в его правильное положение и удаляет все в круглых скобках в одном выражении:

df['movie'].str.replace(r'(.*?),?\s*(The)?\s*\(.*\)\s*', r'\2 \1')

0    The Discreet Charm of the Bourgeoisie
1                           Attack Force Z
2                      The State of Things
Name: movie, dtype: object

Regex

(.*?)   # The actual movie title - first capture group
,?      # Optional comma (preceeding "The")
\s*     # Whitespace
(The)?  # Optional "The" - second capture group
\s*    
\(.*\)  # Stuff within parentheses we don't need
\s*

Обновленные требования:

  • переместить «A», «An», «The» в начало предложения
  • удалить текст в круглых скобках при наличии

Чтобы поддержать дополнительные статьи, давайте сделаем *

df['movie'].str.replace(r'(.*?),?\s*(The|A|An)?(?=\s*\(.*\)\s*|$).*', r'\2 \1')  

0    The Discreet Charm of the Bourgeoisie 
1                           Attack Force Z 
2                      The State of Things 
3                             A Happy Tour 
4                 An Awfully Big Adventure 
5                   The American President 
Name: movie, dtype: object

@ Wiktor может иметь более короткий способ сделать это.

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