簡體   English   中英

Python 使用lookahead/lookbehind替換整個單詞

[英]Python replace whole word using lookahead/lookbehind

在正則表達式中使用向前看和向后看如何使用 python 成功替換以下單詞而不替換其他看起來相似的單詞。

css = '''
     selection-background-color: primary;
     selection-background-color:primary;
     selection-color: text-primary;
     selection-background-color: primary-text;
'''

我試圖根據我在網上研究的內容來使用這個(?<?\w)primary(?=\w)但我對正則表達式和編寫這個的最佳方式並不十分熟悉。

我希望我從上面的代碼中得到的結果可以創建這個......

css = css.replace('primary', 'rgb(255,255,255)')
css = css.replace('primary-text', 'red')
css = css.replace('text-primary', 'green')

返回:

css = '''
     selection-background-color: rgb(255,255,255);
     selection-background-color:rgb(255,255,255);
     selection-color: green;
     selection-background-color: red;
'''

通常您會使用單詞邊界( \b )來解決此類問題,但是因為您的單詞可以作為多部分單詞的一部分出現,其中部分由連字符分隔(與單詞邊界匹配)這將不起作用. 相反,您可以為字符或單詞周圍的連字符匹配向前和向后的否定環視:

import re

css = '''
     selection-background-color: primary;
     selection-background-color:primary;
     selection-color: text-primary;
     selection-background-color: primary-text;
'''

css = re.sub(r'(?<![a-z-])primary(?![a-z-])', 'rgb(255,255,255)', css)
css = re.sub(r'(?<![a-z-])primary-text(?![a-z-])', 'red', css)
css = re.sub(r'(?<![a-z-])text-primary(?![a-z-])', 'green', css)
        
print(css)

Output:

selection-background-color: rgb(255,255,255);
selection-background-color:rgb(255,255,255);
selection-color: green;
selection-background-color: red;

您還可以嘗試基於字典的方法,從字典的鍵中生成正則表達式並替換為匹配的值:

replacements = {
    'primary' : 'rgb(255,255,255)',
    'primary-text' : 'red',
    'text-primary' : 'green'
}
regex = '(?<![a-z-])(?:' + '|'.join(replacements.keys()) + ')(?![a-z-])'

css = re.sub(regex, lambda m: replacements[m.group()], css)

print(css)

由於您的所有替換都在以冒號分隔的鍵值對中的值上,因此您可以改用將值映射到其替換的 dict 並使用re.sub和正則表達式,將值和它們之前的字符分組以替換匹配項一個 function 如果它們在映射表中,則返回被映射替換替換的值:

mapping = {
    'primary': 'rgb(255,255,255)',
    'primary-text': 'red',
    'text-primary': 'green'
}
css = re.sub(
    r'(:\s*)(.*);',
    lambda m: m.group(1) + mapping.get(m.group(2), m.group(2)),
    css
)

暫無
暫無

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

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