簡體   English   中英

Python正則表達式替換文本中未編碼的&符號

[英]Python regular expression to replace unencoded ampersands in text

我正在使用上游系統,有時會向我發送用於HTML / XML輸出的文本,其中包含未編碼的&符號:

str1 = "Stay at this B&B"
str2 = "He’s going to Texas A&M"
str3 = "He’s going to a B&B and then Texas A&M"

我需要用&替換未編碼的&符號& 同時保留屬於字符引用或已編碼的那些。

(修復上游系統不是一個選項,因為文本有時會到達部分編碼,重新編碼整個字符串也不是我能做的事情。我真的只想解決這個嘮叨的問題並繼續與我的生活)

這個正則表達式很好用,但是我在re.sub執行re.sub的語法時遇到了麻煩:

re.findall("&[^#|amp]", str3)

我不確定如何正確替換文字; 我有一種感覺它會涉及re.group但這是我的正則表達式foo中的一個弱點。

任何幫助表示贊賞。

如果&符號是字符實體的一部分,它可以是任何命名實體(不僅僅是& ),十進制實體或十六進制實體。 這應該涵蓋它:

re.sub(r'&(?![A-Za-z]+[0-9]*;|#[0-9]+;|#x[0-9a-fA-F]+;)',
       r'&', your_string)

我建議對此使用否定前瞻。 如果&后跟#xxxx; ,則會導致匹配失敗#xxxx; (其中x是數字)或amp; ,所以它只匹配獨立&字符,並用&

re.sub(r"&(?!#\d{4};|amp;)", "&", your_string)

第一個人很接近:

re.sub(r"&(?!#\d{4};|amp;)", "&amp", your_string)

暫無
暫無

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

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