我有以下测试程序:
import re
class Test:
def __init__ (self):
self.idFiltering = True
self.aliases = [
('rose', 'jasmin')
]
for s in (
'__rose__',
'rose',
'moon__rose',
'rose__fish',
'moon__rose__jelly__fish',
'moon__rose__rose__rose__fish',
'sun.moon.rose',
'rose.fish',
'rosexfish',
'moon.rose.jelly__fish',
'moon/rose',
'rose/fish',
'moon/rose/jelly__fish',
):
print (s, self.filterId (s))
print ('done')
def filterId (self, qualifiedId):
if not self.idFiltering or (qualifiedId.startswith ('__') and qualifiedId.endswith ('__')):
return qualifiedId
else:
for alias in self.aliases:
pattern = re.compile (rf'((__)|(?=[^./])){alias [0]}((__)|(?=[./$]))')
# Replace twice to deal with overlap
qualifiedId = pattern.sub (alias [1], qualifiedId)
qualifiedId = pattern.sub (alias [1], qualifiedId)
return qualifiedId
test = Test ()
我希望它能产生:
__rose__ __rose__
rose jasmin
moon__rose moon__jasmin
rose__fish jasminfish
moon__rose__jelly__fish moonjasminjelly__fish
moon__rose__rose__rose__fish moonjasminjasminjasminfish
sun.moon.rose sun.moon.jasmin
rose.fish jasmin.fish
rosexfish rosexfish
moon.rose.jelly__fish moon.jasmin.jelly__fish
moon/rose moon/jasmin
rose/fish jasmin/fish
moon/rose/jelly__fish moon/jasmin/jelly__fish
done
但它会产生:
__rose__ __rose__
rose rose
moon__rose moon__rose
rose__fish jasminfish
moon__rose__jelly__fish moonjasminjelly__fish
moon__rose__rose__rose__fish moonjasminjasminjasminfish
sun.moon.rose sun.moon.rose
rose.fish jasmin.fish
rosexfish rosexfish
moon.rose.jelly__fish moon.jasmin.jelly__fish
moon/rose moon/rose
rose/fish jasmin/fish
moon/rose/jelly__fish moon/jasmin/jelly__fish
done
换言之,它不能取代单词末尾的“rose”。 它似乎忽略了我模式中的$。 我做错什么了?你知道吗
【阿兰·菲和普什佩什·库马尔·拉贾万希评论后编辑】
我把正则表达式改为:
rf'((__)|(?=[^./])){alias [0]}((__)|(?=[./])|$)'
现在一切正常,我的问题解决了。你知道吗
我也试过:
rf'(^|(__)|(?=[./])){alias [0]}((__)|(?=[./])|$)'
但这是行不通的。只是好奇:为什么不呢?你知道吗
[编辑2]
正如布莱克所指出的,我的解决方案完全靠运气。 根据他/她的建议,我想我找到了合适的正则表达式:
rf'(^|(__)|(?<=[./])){alias [0]}((__)|(?=[./])|$)'
它产生了预期的输出,这次不是巧合。你知道吗
当您在
[]
中放置特殊的regex属性时,它们就失去了它们的意义,表现得像普通字符一样。这就是[./$]
不起作用的原因。另外,将^
放在方括号内意味着不要过滤其中的所有属性:[^./]
。你知道吗相关问题 更多 >
编程相关推荐