Python Regex более длинный дефис и буква перед ним

У меня есть DataFrame, в котором некоторые значения хранятся как «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол» с более длинным дефисом «–» (а не коротким тире «-»). Я пытаюсь удалить их с помощью регулярных выражений в командной строке Windows, но это не работает должным образом.

  1. прямой ввод дефиса, как показано ниже, не работает (достаточно верный):
XXX.replace(to_replace=r'\–', value=' ', regex=True)

XXX.replace(to_replace='–', value=' ')

и дает без изменений «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол». Таким образом, я предполагаю, что по какой-то причине cmd не распознает дефис.

  1. общая форма "строчная буква + дефис + прописная буква", поэтому я также пробовал
XXX.replace(to_replace=r'(?=[a-z]+)\W(?=[A-Z]+)', value=' ', regex=True)

интересно, что это дает без изменений «Майами – Форт-Лодердейл» и «Миннеаполис – Сент-Пол».

  1. однако следующее будет работать
XXX.replace(to_replace=r'\W(?=[A-Z]+)', value=' ', regex=True)

и дает желанные «Майами Форт-Лодердейл» и «Миннеаполис Сент-Пол». Но проблема в том, что это путает другие значения, такие как «Вашингтон, округ Колумбия». в «Вашингтон, округ Колумбия». (видимо).

================================================== ===

В конце концов я решил это

XXX.replace(to_replace=r'\W(?=\w+\s)', value=' ', regex=True)

но мне все равно интересно, как Regex распознает букву перед дефисом "-". Мне кажется, что по какой-то причине буква перед дефисом не считается буквой?

Питон 2 или 3? Здесь у вас есть тире, и, похоже, оно работает нормально, кстати, его не нужно экранировать. Кроме того, вы, возможно, пропустили inplace=True? Что касается регулярного выражения в пункте 2, вы только что сделали опечатку, используя в начале просмотр вперед, это должно быть просмотр назад, r'(?<=[a-z])\W(?=[A-Z]).

Wiktor Stribiżew 18.12.2020 10:57

Хотя я бы предпочел использовать r'(?<=[a-z])[^\w\s](?=[A-Z]), чтобы исключить пробелы.

Wiktor Stribiżew 18.12.2020 11:02

@WiktorStribiżew Привет, я использую Python 3.7.9. Хороший вопрос, но нет, это не о месте. С ним или без него у меня не работало.

Grumpy Civet 18.12.2020 11:02

Я не могу воспроизвести содержание вашего поста. Но я помню, что юникод идет с набором или близкими символами: - или ДЕФИС-МИНУС (U+002D), или EN DASH (U+2013) и или EM DASH (U+2014). Может быть, есть и другие. Убедитесь, что используете правильный...

Serge Ballesta 18.12.2020 11:07

@WiktorStribiżew .replace(to_replace=r'(?<=[a-z])[^\w\s](?=[A-Z])', value=' ', regex=True) работает отлично. большое спасибо!

Grumpy Civet 18.12.2020 11:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
5
149
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мне не совсем понятно, используете ли вы обычный 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. в противном случае это отлично работает, когда не внутри фрейма данных

Grumpy Civet 18.12.2020 11:04

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

Tim Biegeleisen 18.12.2020 11:05

Спасибо! это тоже важное направление. Я должен рассмотреть возможность использования другой платформы

Grumpy Civet 18.12.2020 11:11
Ответ принят как подходящий

я предлагаю использовать

.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])

Другие вопросы по теме