簡體   English   中英

正則表達式刪除除第一次出現和最后一次出現的特殊字符

[英]regex remove special character except first occurrence and last occurrence

我需要刪除尖括號內的特殊字符(<>)

date = "<dd_mm_yyyy>"
date_check_pattern= re.sub("[^A-Za-z<>]","",date)

但它不適用於

date = "<dd>_<mm>_<yyyy>"
#expected output <ddmmyyyy>

除第一次和最后一次出現外,如何刪除此尖括號

這可能不是您想要的,但是如果字符總是出現在行的開頭和結尾,那么您可以使用否定的后視和否定的前瞻來與開頭或結尾的字符不匹配

import re

date = "<dd_mm_yyyy>"
date_check_pattern = re.sub("(?<!^)[^A-Za-z<>](?!$)","",date)
print(date_check_pattern)

輸出

<ddmmyyyy>

您可以匹配整個字符串並捕獲<>之間的內容

然后進行第二次替換,從第一個模式中的組 1 匹配中刪除所有不允許的字符。

第一個模式匹配

  • <(.*?)>匹配<...>並捕獲第 1 組之間的內容
  • (?=正向前瞻,斷言右邊是什么
    • [^\s<>]*$可選匹配除<>之外的任何字符,直到字符串末尾
  • )關閉前瞻

正則表達式演示

第二個 sub 中的否定字符類[^A-Za-z0-9]+表示匹配除字符類中列出的字符之外的任何字符的 1+ 倍。

示例代碼

import re

strings = [
    "<dd>_<mm>_<yyyy>",
    "<dd_mm_yyyy>",
    "<01>_<01>_<2022>",
    "file_name<dd>_<mm>_<yyyy>.csv",
    "file_name<01>_<01>_<2022>.csv",
    "file_name_<dd>_<mm>_<yyyy>_anything.csv"
]

for s in strings:
    print(
        re.sub(
            r'<(.*?)>(?=[^\s<>]*$)',
            lambda x: f"<{re.sub(r'[^A-Za-z0-9]+', '', x.group(1))}>",
            s
        )
    )

輸出

<ddmmyyyy>
<ddmmyyyy>
<01012022>
file_name<ddmmyyyy>.csv
file_name<01012022>.csv
file_name_<ddmmyyyy>_anything.csv

我建議您不要為此使用正則表達式。 您可以使用以下功能,也可以自定義 specialChar

def removeSpecialChar(date):
    result = ""
    open = False
    specialChar = "_<>"
    index = 0

    lastClose = len(date)-date[::-1].find(">")-1 if date[::-1].find(">") != -1 else None
    if not lastClose: return date

    for c in date:
        if not open and c == "<":
            open = True
            result += c
        elif open and c == ">" and index==lastClose : open = False

        if open and c not in specialChar:
            result += c
        elif not open:
            result += c

        index+=1

    return result

例子

>>> removeSpecialChar("<dd>_<mm>_<yyyy>")
"<ddmmyyyy>"

>>> removeSpecialChar("Date: (<dd>_<mm>_<yyyy>)")
"Date: (<ddmmyyyy>)"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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