0

我正在使用 Python 正则表达式,并且试图从匹配对象中获取模式匹配,而不是文本匹配本身。

我有一些要替换的模式,我正在这样做:

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)返回匹配的文本,所以它们都不等于模式字典的任何键。

我试过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)

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

4

1 回答 1

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)
于 2019-10-25T22:42:39.680 回答