簡體   English   中英

從匹配項 object 中獲取匹配的模式

[英]Getting pattern matched from match object

我正在使用 Python 正則表達式,我正在嘗試從匹配項 object 中獲取模式匹配,而不是文本匹配本身。

我有一些模式要替換,我正在這樣做:

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 object 並且其針對此問題的模式是'^[ |\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)

但仍然不是總能從匹配組中獲取模式的方法。

我認為沒有辦法直接找出匹配的替代方案。

使用列表而不是字典,並將每個模式放在捕獲組中。 然后您可以查看匹配的捕獲組,並將其用作索引以獲取相應的替換。

請注意,如果模式中有任何捕獲組,這將不起作用。 如果需要組,請確保它們不是捕獲的。

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)

如果我做對了,你想要去除前導和尾隨空格並將中間的空格減少到一個。

首先,您的代碼可能有一個錯誤: [ |\n]將匹配一個空格 ( )、pipe ( | ) 或換行。 您可能不想匹配 pipe,但您可能想要匹配所有空白字符,例如制表符 ( \t )。

其次,樣式:保持你的行在 80 個字符以下,並且括號中的索引周圍沒有空格。

第三,刪除前導和尾隨空格只需使用str.strip 現在唯一需要替換的是兩個或更多空格的序列,這很容易與\s{2,}\s = “whitespace”, {2,} = “兩個或更多”)匹配。

這是您的代碼的修改:

import re


patterns = [
    (r"^[ |\n]+", ""),
    (r"[ |\n]+$", ""),
    (r"[ |\n]+", " "),
]


def get_replacement(m: re.Match) -> str:
    return next(
        patterns[i][1]
        for i, group in enumerate(m.groups())
        if group is not None
    )


text = (
    "\n"
    " \t   Hello there,  I\n need your help  here    plase :) \t  \n"
    " \t   Hello there,  I\n need your help  here    plase :)  \t "
    "\n"
)
result1 = re.sub(
    "|".join(f"({p})" for p, _ in patterns),
    get_replacement,
    text,
)
result2 = re.sub(r"[ \n]{2,}", " ", text.strip())
result3 = re.sub(r"\s{2,}", " ", text.strip())
print(repr(result1))
print(repr(result2))
print(repr(result3))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM