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