2 回答
TA貢獻1842條經驗 獲得超22個贊
您可能正在尋找
import re
text = "123 Lorem ipsum dolor sit amet, word WORD WoRd consetetur sadipscing elitr, sed diam 123"
pattern = re.compile(r'\bword\b', re.IGNORECASE)
for word in pattern.finditer(text):
print(word.group(0))
這會產生
word
WORD
WoRd
\b是縮寫形式
(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))
其中讀到
(?=\w)(?<!\w) # positive lookahead making sure there's a word character coming
# negative lookbehind making sure theres' n word characte preceding
| # or
(?<=\w)(?!\w) # the other way round
所以,是的
(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))word(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))
會產生與上面相同的匹配,但似乎有點不可讀。
TA貢獻1835條經驗 獲得超7個贊
(?<![^a-zA-Z0-9]) 是雙重否定。您是說,如果主表達式之前的字符不在 [a-zA-Z0-9] 中,則它不應該匹配,也就是說,只有當該字符在 [a-zA-Z0-9] 中時,它才能匹配。只需刪除 ^: (?<![a-ZA-Z0-9])。
您使用的字符串邊界 ^ 和 $ 在這里會令人困惑,但如果您使用負向后查找和負向前查找,則不需要它們。
因此,切換到(?<![a-zA-Z0-9])(word|WORD)(?![a-zA-Z0-9])。
也就是說,@user3783243 關于 \b 的評論是一個更好的選擇。\b 是一個“單詞邊界”,它準確地代表了您要捕獲的內容。
添加回答
舉報
