Python 正则表达式更长的连字符和前面的字母
Python Regex longer hyphen and letter before it
我有一个 DataFrame,其中一些值存储为“Miami–Fort Lauderdale”和“Minneapolis–Saint Paul”,带有较长的连字符“–”(不是短破折号“-”)。我试图在 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)
并给出所需的“迈阿密劳德代尔堡”和“明尼阿波利斯圣保罗”。但问题是这会弄乱其他值,例如“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 字母的位置匹配的正前瞻。
此外,请注意 \w
匹配下划线,下划线也是标点符号。如果您需要在此处“包含”它,则需要进行替换:
(?<=[a-z])(?:[^\w\s]|_)(?=[A-Z])
我有一个 DataFrame,其中一些值存储为“Miami–Fort Lauderdale”和“Minneapolis–Saint Paul”,带有较长的连字符“–”(不是短破折号“-”)。我试图在 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)
并给出所需的“迈阿密劳德代尔堡”和“明尼阿波利斯圣保罗”。但问题是这会弄乱其他值,例如“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 字母的位置匹配的正前瞻。
此外,请注意 \w
匹配下划线,下划线也是标点符号。如果您需要在此处“包含”它,则需要进行替换:
(?<=[a-z])(?:[^\w\s]|_)(?=[A-Z])