我有一个带假日名称的数据框。我有一个问题,在某些日子里,假日在不同的日子,有时在另一个假日的那天被观察到。以下是一些示例问题:
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))
但这引起了马丁·路德·金,小日的问题。
答案 0 :(得分:4)
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
- 除([^,]+)
,
- 一个或多个空格\s+
- 文字子串\(Observed\)
(Observed)
- 除了换行符之外的任何0 +字符,尽可能多到行尾。