我正在使用python regex,并且我试图从匹配对象获得模式匹配,而不是文本匹配。
我要替换一些模式,我正在这样做:
import re
patterns = {
r'^[ |\n]+': '',
r'[ |\n]+$': '',
r'[ |\n]+': ' '
}
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join(patterns.keys()),
lambda match: patterns[ match.group(0) ],
text)
但这是错误的解决方案,因为match.group(0)
返回匹配的文本,因此它们都不等于模式dict的任何键。
我尝试了match.pattern
,但遇到了一个异常,并尝试了match.re
,但这给出了所有re.compile
对象,其针对此问题的模式为'^[ |\n]+|[ |\n]+$|[ |\n]+'
。非常感谢您的帮助。
编辑:基于Barmar解决方案,我得到了:
import re
patterns = [
(r'^[ |\n]+', ''),
(r'[ |\n]+$', ''),
(r'[ |\n]+', ' ')
]
def getreplacement(match):
for i, group in enumerate(match.groups()):
if group:
return patterns[ i ][ 1 ]
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join('(' + p[ 0 ] + ')' for p in patterns), getreplacement, text)
print(text)
但仍然不是始终从匹配组中获取模式的方法。
答案 0 :(得分:0)
我认为没有办法直接找出匹配的替代方案。
使用列表而不是字典,然后将每个模式放在捕获组中。然后,您可以查看匹配的捕获组,并将其用作索引以获取相应的替换组。
请注意,如果模式中有任何捕获组,则此操作将无效。如果需要分组,请确保它们不被捕获。
import re
patterns = [
(r'^[ |\n]+', ''),
(r'[ |\n]+$', ''),
(r'[ |\n]+', ' ')
]
def getreplacement(match):
for i in range(1, match.groups):
if match.group(i):
return patterns[i-1][1]
text = ' Hello there, I\n need your help here plase :) '
text = re.sub('|'.join('(' + p[0] + ')' for p in patterns), getreplacement, text)