python正则表达式匹配并替换字符串的开头和结尾但保留中间

PL3*_*PL3 3 python regex replace pandas

我有一个带有假日名称的数据框。我有一个问题,在某些日子里,假期是在不同的日子里观察到的,有时是在另一个假期的那一天。以下是一些示例问题:

1  "Independence Day (Observed)"
2  "Christmas Eve, Christmas Day (Observed)"
3  "New Year's Eve, New Year's Day (Observed)"
4  "Martin Luther King, Jr. Day"
Run Code Online (Sandbox Code Playgroud)

我想将所有 ' (Observed)' 替换为 '' 以及仅当匹配 ' (Observed)' 时逗号前的所有内容。输出应该是:

1  "Independence Day"
2  "Christmas Day"
3  "New Year's Day"
4  "Martin Luther King, Jr. Day"
Run Code Online (Sandbox Code Playgroud)

我能够独立完成这两项工作:

(foo['holiday']
 .replace(to_replace=' \(Observed\)', value='', regex=True)
 .replace(to_replace='.+, ', value='', regex=True))
Run Code Online (Sandbox Code Playgroud)

但这给“小马丁·路德·金”带来了问题。

Chr*_*oth 5

替换.py

import re

input = [
    "Independence Day (Observed)",
    "Christmas Eve, Christmas Day (Observed)",
    "New Year's Eve, New Year's Day (Observed)",
    "Martin Luther King, Jr. Day"
]

for holiday in input:
    print re.sub('^(.*?, )?(.*?)( \(Observed\))$', '\\2', holiday)
Run Code Online (Sandbox Code Playgroud)

输出

> python replace.py 
Independence Day
Christmas Day
New Year's Day
Martin Luther King, Jr. Day
Run Code Online (Sandbox Code Playgroud)

解释

  • ^: 匹配字符串的开头。
  • (.*?, )?: 匹配任何后跟命令和空格的内容。使其成为惰性匹配,因此它不会消耗我们想要保留的字符串部分。最后一个?使整个事情成为可选的,因为一些示例输入根本没有逗号。
  • (.*?): 抓取我们想要稍后在捕获组中使用的部分。这部分也是一个懒惰的匹配,因为......
  • ( \(Observed\)): 一些字符串的末尾可能有“(Observed)”,所以我们在这里单独声明。前一块中的惰性匹配不会消耗它。
  • $: 匹配字符串末尾。