我希望使用正則運算式來查找給定字串中某個字母的所有實體,但如果該字母出現在更大的單詞/短語中,則不會。例如:
對于測驗字串:
滯后(a,1) 252*a 最大值(3a*2) / 5*pctrange(a,10)
我想獲取字母“a”的所有實體,不包括以下三個單詞中出現的字母“a”:
滯后最大 pctrange
即,我想使用正則運算式來獲取此處突出顯示的字母“a”的所有實體:
滯后(一,1) 252*一 最大(3一*2)/ 5*pctrange(一,10)
我嘗試使用以下正則運算式,但它一直在我想要的字母“a”之后包含該字符:
a[^"lag|max|pctrange"]
為了提供一些背景關系,我在 Python 中希望使用 re 模塊替換這些“a”實體:
import re
string = "lag(a,1) 252*a max(3a*2) / 5*pctrange(a,10)"
words = ["lag", "max", "pctrange"]
replace = "_"
re.sub(f"a[^\"{'|'.join(words)}\"]", replace, string)
這會導致(不需要的)輸出:
lag(_1) 252*_ max(3_2) / 5*pctrange(_10)
我希望輸出如下:
lag(_,1) 252*_ max(3_*2) / 5*pctrange(_,10)
編輯:請注意,搜索并不總是針對單個字母,例如,有時我想搜索“aa”而不是“a”,或“bdg”而不是“a”等。更重要的是關注要排除的單詞串列(例如,在上面的示例中,“lag”、“max”和“pctrange”)。我不需要忽略除此串列中顯示的特定單詞之外的任何內容。謝謝你。
uj5u.com熱心網友回復:
我認為您正在尋找的是世界邊界:
以下正則運算式僅當 a 包含在兩個世界邊界內或后面有數字時才匹配:
(?<=\d)a\b|\ba\b
https://regex101.com/r/7IfinZ/1
uj5u.com熱心網友回復:
為防止a
與另一個字母相鄰時被匹配,請嘗試否定環視。
(?i)(?<![a-z])a(?![a-z])
請參閱 regex101 上的此演示- 使用(?i)
標志進行無大小寫匹配:[a-z]
→[a-zA-Z]
更新:要跳過某些單詞并匹配剩余的a
嘗試PyPI regex using verbs (*SKIP)(*F)
。
import regex as re
str = re.sub(fr"\b(?i:{'|'.join(words)})\b(*SKIP)(*F)|a", "_", str)
regex101 上的另一個演示或在 tio.run 上查看Python 演示
|
交替左側的內容將被跳過,右側的內容將被匹配。對非捕獲組內的單詞使用了i
忽略大小寫標志 和\b
單詞邊界。(?:
)
uj5u.com熱心網友回復:
此正則運算式側重于匹配變數,但不包括某些單詞:
[a-z] (?<!lag|pctrange|max)
https://regex101.com/r/zBHPQu/1
在這種情況下,使這個正則運算式起作用的是所有格量詞(“ ”),它盡可能多地匹配 [az] 模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527120.html
標籤:正则表达式蟒蛇重新