Python 正则表达式更长的连字符和前面的字母

Python Regex longer hyphen and letter before it

我有一个 DataFrame,其中一些值存储为“Miami–Fort Lauderdale”和“Minneapolis–Saint Paul”,带有较长的连字符“–”(不是短破折号“-”)。我试图在 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)

并给出所需的“迈阿密劳德代尔堡”和“明尼阿波利斯圣保罗”。但问题是这会弄乱其他值,例如“Washington, D.C”。进入“华盛顿特区”。 (显然)。

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

我最终通过

解决了这个问题
XXX.replace(to_replace=r'\W(?=\w+\s)', value=' ', regex=True)

但我仍然想知道正则表达式如何识别连字符“–”之前的字母。在我看来,由于某种原因,连字符之前的字母不被视为字母?

我不完全清楚您使用的是常规 Python、Pandas 还是其他内容。您可能遇到的一个问题是您从未声明 [​​=16=] 脚本使用 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

我建议使用

.replace(to_replace=r'(?<=[a-z])[^\w\s](?=[A-Z])', value=' ', regex=True)

这里,

  • (?<=[a-z]) - 正向后视匹配前面紧跟小写 ASCII 字母的位置
  • [^\w\s] - 除了单词和空格字符之外的字符
  • (?=[A-Z])- 与紧跟大写 ASCII 字母的位置匹配的正前瞻。

参见regex demo online

此外,请注意 \w 匹配下划线,下划线也是标点符号。如果您需要在此处“包含”它,则需要进行替换:

(?<=[a-z])(?:[^\w\s]|_)(?=[A-Z])