У меня есть DataFrame, в котором некоторые значения хранятся как «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол» с более длинным дефисом «–» (а не коротким тире «-»). Я пытаюсь удалить их с помощью регулярных выражений в командной строке Windows, но это не работает должным образом.
XXX.replace(to_replace=r'\–', value=' ', regex=True)
XXX.replace(to_replace='–', value=' ')
и дает без изменений «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол». Таким образом, я предполагаю, что по какой-то причине cmd не распознает дефис.
XXX.replace(to_replace=r'(?=[a-z]+)\W(?=[A-Z]+)', value=' ', regex=True)
интересно, что это дает без изменений «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол».
XXX.replace(to_replace=r'\W(?=[A-Z]+)', value=' ', regex=True)
и дает желанные «Майами Форт-Лодердейл» и «Миннеаполис Сент-Пол». Но проблема в том, что это путает другие значения, такие как «Вашингтон, округ Колумбия». в «Вашингтон, округ Колумбия». (видимо).
================================================== ===
В конце концов я решил это
XXX.replace(to_replace=r'\W(?=\w+\s)', value=' ', regex=True)
но мне все равно интересно, как Regex распознает букву перед дефисом "-". Мне кажется, что по какой-то причине буква перед дефисом не считается буквой?
Хотя я бы предпочел использовать r'(?<=[a-z])[^\w\s](?=[A-Z]), чтобы исключить пробелы.
@WiktorStribiżew Привет, я использую Python 3.7.9. Хороший вопрос, но нет, это не о месте. С ним или без него у меня не работало.
Я не могу воспроизвести содержание вашего поста. Но я помню, что юникод идет с набором или близкими символами: - или ДЕФИС-МИНУС (U+002D), – или EN DASH (U+2013) и — или EM DASH (U+2014). Может быть, есть и другие. Убедитесь, что используете правильный...
@WiktorStribiżew .replace(to_replace=r'(?<=[a-z])[^\w\s](?=[A-Z])', value=' ', regex=True) работает отлично. большое спасибо!






Мне не совсем понятно, используете ли вы обычный Python, Pandas или что-то еще. Одна из возможных проблем, с которой вы можете столкнуться, заключается в том, что вы никогда не заявляли, что ваш скрипт Python использует символы UTF-8. Рассмотрим следующий рабочий пример:
# -*- coding: utf-8 -*-
import re
inp = "Miami–Fort Lauderdale"
output = re.sub(r'–', ' ', inp)
print(inp + "\n" + output)
Это печатает (как и ожидалось):
Miami–Fort Lauderdale
Miami Fort Lauderdale
Это очень странно: 1. когда я напрямую копирую ваш код в Windows cmd, дефис превращается в тире 2. в противном случае это отлично работает, когда не внутри фрейма данных
... что также может быть проявлением проблемы с используемым вами набором символов (возможно, cmd не поддерживает тот или иной символ).
Спасибо! это тоже важное направление. Я должен рассмотреть возможность использования другой платформы
я предлагаю использовать
.replace(to_replace=r'(?<=[a-z])[^\w\s](?=[A-Z])', value=' ', regex=True)
Здесь,
(?<=[a-z]) - положительный просмотр, который соответствует местоположению, непосредственно предшествующему строчной букве ASCII.[^\w\s] - символ, отличный от слова и символа пробела(?=[A-Z])- положительный просмотр вперед, который соответствует местоположению, за которым сразу следует заглавная буква ASCII.Посмотрите демонстрацию регулярного выражения онлайн.
Также обратите внимание, что \w соответствует знаку подчеркивания, который также является знаком пунктуации. Если вам когда-нибудь понадобится «включить» его сюда, вам понадобится чередование:
(?<=[a-z])(?:[^\w\s]|_)(?=[A-Z])
Питон 2 или 3? Здесь у вас есть тире, и, похоже, оно работает нормально, кстати, его не нужно экранировать. Кроме того, вы, возможно, пропустили
inplace=True? Что касается регулярного выражения в пункте 2, вы только что сделали опечатку, используя в начале просмотр вперед, это должно быть просмотр назад,r'(?<=[a-z])\W(?=[A-Z]).