Удалить слова, которые являются только пунктуацией в pandas серии - PullRequest
3 голосов
/ 28 апреля 2020

Представьте, что у меня есть следующие pandas серии:

tmp = pd.Series(['k.; mlm', '(+).', 'a;b/c', '!".: abc', 'abc dfg', 'qwert@'])

И я хочу, для всех элементов, удалить слова, которые являются только пунктуациями с помощью регулярных выражений, я пытался используйте что-то вроде:

tmp.str.replace(regex, '')

Моя последняя серия будет:

tmp = pd.Series(['k.; mlm', '', 'a;b/c', 'abc', 'abc dfg', 'qwert@'])

Редактировать: я рассматриваю пунктуацию в таблице Unicode

Ответы [ 4 ]

2 голосов
/ 28 апреля 2020

Вы можете использовать str.contains с шаблоном [^\W] для сопоставления строк, содержащих хотя бы один символ, который не является знаком пунктуации.

Обратите внимание, что [] соответствует любому символ, содержащийся в наборе, и добавляя ^ в начале, все символы, которых нет в наборе, будут сопоставлены.

tmp.where(tmp.str.contains(r'[^\W]'), '')

0     k.; mlm
1            
2       a;b/c
3    !".: abc
4     abc dfg
5      qwert@
dtype: object
1 голос
/ 28 апреля 2020

Похоже, что вы планировали очистить значение поля (замените его пустой строкой), если вся строка состоит из знаков препинания.

Вы можете сделать это с помощью

tmp.str.replace(r'^(?:[^\w\s]|_)+$', '')

См. Демоверсию regex . ПРИМЕЧАНИЕ : Если вы планируете очистить только значения строк, которые состоят только из ASCII пунктуации , вы можете использовать string.punctuation:

tmp.str.replace(f"^[{''.join(map(re.escape,string.punctuation))}]+$", '')

print(f"[{''.join(map(re.escape,string.punctuation))}]") показывает [!"\#\$%\&'\(\)\*\+,\-\./:;<=>\?@\[\\\]\^_`\{\|\}\~], см. онлайн-демонстрацию . Как и ожидалось, он не соответствует пунктуации, такой как , , , , «, », et c.

Details

  • ^ - начало строки
  • (?: - начало группы без захвата
    • [^ - начало класса отрицательных символов (он будет соответствовать всем символам, НО указанным внутри него):
      • \w - символы слова (любые буквы, цифры и Unicode _)
      • \s - любой код Unicode пробел
    • ]+ - конец класса, + повторяется 1 или более раз
    • | - или
    • _ - подчеркивание
  • ) - конец группы
  • $ - конец строки.

Pandas тест:

>>> tmp.str.replace(r'^(?:[^\w\s]|_)+$', '')
0     k.; mlm
1            
2       a;b/c
3    !".: abc
4     abc dfg
5      qwert@
dtype: object
1 голос
/ 28 апреля 2020

IICU

tmp.replace('[()+!".:]', '', regex=True).to_list()

OUTCOME

['k; mlm', '', 'a;b/c', ' abc', 'abc dfg', 'qwert@']

Объяснение [] в этом случае содержит символы для сопоставления df. replace Заменяет значения, указанные в to_replace, на значение. Я установил Regex = True, потому что я использовал выражение Regex. Наконец я конвертирую их в список по df.to_list() function

1 голос
/ 28 апреля 2020

Вы можете использовать str.replace с отрицательным регулярным выражением lookahead, оно ищет строку, содержащую любой алфавитный символ c (обозначается \ w)

tmp.replace('^((?!\w).)*$', '', regex=True)

0     k.; mlm
1            
2       a;b/c
3    !".: abc
4     abc dfg
5      qwert@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...