簡體   English   中英

python regex匹配並替換字符串的開頭和結尾,但保持中間

[英]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))

但這引起了“馬丁·路德·金,戴·戴”的問題。

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)”,因此我們在這里在單獨的組中聲明。 上一部分中的惰性匹配不會消耗掉它。
  • $ :在字符串末尾匹配。

我建議

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM