从匹配对象获取模式匹配

时间:2019-10-25 22:32:29

标签: python regex python-3.x python-regex

我正在使用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)

但仍然不是始终从匹配组中获取模式的方法。

1 个答案:

答案 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)