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