如果您使用re.IGNORECASE,则您的正则表达式已经在工作,例如:
import re
pat = "(?:^|\s)([e]\.[g](\.)?)(?=\s|$)" # unchanged from question
data = "e.g E.g E.G. e.g."
regex = re.compile(pat, re.IGNORECASE) # note the IGNORECASE
print(regex.findall(data))
给予
[('e.g', ''), ('E.g', ''), ('E.G.', '.'), ('e.g.', '.')]
或者如果您不想使用re.IGNORECASE,则在字符类中包含大写变体:
import re
pat = "(?:^|\s)([eE]\.[gG](\.)?)(?=\s|$)" # note the [eE] and [gG] here
data = "e.g E.g E.G. e.g."
regex = re.compile(pat)
print(regex.findall(data))
(与上面相同的输出)。
但默认情况下,[e] 将是区分大小写的匹配项(在这种情况下,[ ... ] 没有任何区别,因为它意味着匹配方括号内的任何字符,但是只有一个)。
然后用空格替换,使用sub。这将替换 all 行中的匹配项,因此等效于 findall。例如:
import re
pat = "(?:^|\s)([eE]\.[gG](\.)?)(?=\s|$)"
data2 = "test e.g test E.g test E.G. test e.g. test"
regex = re.compile(pat)
print(regex.sub(" ", data2)) # <== using sub
给予
test test test test test