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

时间:2017-07-25 16:11:55

标签: python regex pandas replace

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

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"

我想替换所有' (观测)'与''只有当'以及逗号之前的所有内容(观测)'匹配。输出应该是:

1  "Independence Day"
2  "Christmas Day"
3  "New Year's Day"
4  "Martin Luther King, Jr. Day"

我能够独立完成两项任务:

(foo['holiday']
 .replace(to_replace=' \(Observed\)', value='', regex=True)
 .replace(to_replace='.+, ', value='', regex=True))

但这引起了马丁·路德·金,小日的问题。

2 个答案:

答案 0 :(得分:4)

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

输出

> python replace.py 
Independence Day
Christmas Day
New Year's Day
Martin Luther King, Jr. Day

说明

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

答案 1 :(得分:1)

我建议

2017-07-25T00:00:00.000Z

替换为r'^(?:.*,\s*)?\b([^,]+)\s+\(Observed\).*' 反向引用。

请参阅Integer.parseInt() documentation

模式详情

  • r'\1' - 字符串开头
  • ^ - 可选序列:
    • (?:.*,\s*)? - 除了换行符之外的任何0 +字符,直到最后一次出现.*,,然后是,
    • , - 0个或更多空格
  • \s* - 字边界
  • \b - 除([^,]+)
  • 以外的1个或多个字符
  • , - 一个或多个空格
  • \s+ - 文字子串\(Observed\)
  • (Observed) - 除了换行符之外的任何0 +字符,尽可能多到行尾。