[英]python regex match and replace beginning and end of string but keep the middle
我有一個帶有假期名稱的數據框。 我有一個問題,在某些日子里,假期會在不同的日子出現,有時是在另一個假期的日子。 以下是一些示例問題:
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))
但這引起了“馬丁·路德·金,戴·戴”的問題。
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)”,因此我們在這里在單獨的組中聲明。 上一部分中的惰性匹配不會消耗掉它。 $
:在字符串末尾匹配。 我建議
r'^(?:.*,\s*)?\b([^,]+)\s+\(Observed\).*'
替換為r'\\1'
引用。
參見regex演示 。
圖案細節 :
^
-字符串的開頭 (?:.*,\\s*)?
-可選的順序:
.*,
-除換行符以外的任意0+個字符,應盡可能多,直到最后一次出現,
在行上,然后是,
\\s*
-0或多個空格 \\b
單詞邊界 ([^,]+)
-除1個或多個字符之外,
\\s+
-1個或多個空格 \\(Observed\\)
-文字子字符串(Observed)
.*
-直到行尾為止的除換行符以外的任何0+個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.